【RESTful API】RESTful接口设计练习

参考:

BV1Ps4y1J7Ve

----------------------------------------------------------------------------------------------------------

一、RESTful框架

常见的有SpringMVC,jersey,play

二、API测试工具

Postman,Insomnia

三、RESTful接口设计练习

3.1 项目准备

构建一个标准的Springboot项目,使用web环境

(1)SpringBoot的依赖配置


     
        org.springframework.boot
        spring-boot-starter-parent
        2.7.16
        
    

    
         
            org.springframework.boot
            spring-boot-starter-web
        

         
            org.projectlombok
            lombok
            1.18.12
            provided
        
    

将其复制到项目的pom.xml文件的中。

(2)配置application.properties

【RESTful API】RESTful接口设计练习_第1张图片

server.port=8080

(3)编辑实体类,启动类,controller类

实体类:

【RESTful API】RESTful接口设计练习_第2张图片

package com.wangjingwen.rest.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Long id;
    private String name;
    private int age;
}

启动类:

【RESTful API】RESTful接口设计练习_第3张图片

package com.wangjingwen.rest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

controller类:

【RESTful API】RESTful接口设计练习_第4张图片

package com.wangjingwen.rest.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

// 员工的对外接口声明类(员工控制层)
@Controller
public class EmployeeController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "ok";
    }
}

 【RESTful API】RESTful接口设计练习_第5张图片

3.2 接口设计

3.2.1 获取所有员工信息

(1)请求路径:确认资源 —— /employees

(2)请求方式:查询 —— GET

(3)请求参数:无

(4)请求响应:多个员工 —— List —— json格式

【RESTful API】RESTful接口设计练习_第6张图片

【RESTful API】RESTful接口设计练习_第7张图片

【RESTful API】RESTful接口设计练习_第8张图片

注:在浏览器地址栏里发起的请求都是GET方式的请求

【RESTful API】RESTful接口设计练习_第9张图片

【RESTful API】RESTful接口设计练习_第10张图片

当创建了了JsonResult类之后(JsonResult代码见3.2.4),可将代码修改为:

【RESTful API】RESTful接口设计练习_第11张图片

【RESTful API】RESTful接口设计练习_第12张图片

3.2.2 新增一个员工

(1)请求路径:确认资源 —— /employees

(2)请求方式:添加 —— POST

(3)请求参数:员工相关属性 —— name, age, ...

(4)请求响应:新增员工对象 —— Employee —— json格式

【RESTful API】RESTful接口设计练习_第13张图片

因为在浏览器地址栏里发起的请求都是GET方式的请求,所以在这里要用到测试工具Postman。

【RESTful API】RESTful接口设计练习_第14张图片

3.2.3 更新一个员工

【RESTful API】RESTful接口设计练习_第15张图片

【RESTful API】RESTful接口设计练习_第16张图片

3.2.4 删除一个员工

【RESTful API】RESTful接口设计练习_第17张图片

【RESTful API】RESTful接口设计练习_第18张图片

【RESTful API】RESTful接口设计练习_第19张图片

package com.wangjingwen.rest.util;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class JsonResult {
    private int code;   // 请求操作完之后返回的状态码:操作成功200,操作失败500,没有登录403
    private String msg; // 请求操作之后返回的信息
    private Object data;    //请求响应的数据

    public JsonResult(int code, String msg, Object data){
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static JsonResult error(String msg){
        return new JsonResult(500, msg, null);
    }
    public static JsonResult error(String msg, Object data){
        return new JsonResult(500, msg, data);
    }
    public static JsonResult success(){
        return new JsonResult(200, "操作成功", null);
    }
    public static JsonResult success(Object data){
        return new JsonResult(200, "操作成功", data);
    }

}

【RESTful API】RESTful接口设计练习_第20张图片

3.2.5 获取一个员工信息

【RESTful API】RESTful接口设计练习_第21张图片

【RESTful API】RESTful接口设计练习_第22张图片

【RESTful API】RESTful接口设计练习_第23张图片

传入多个参数时:

    @RequestMapping(value = "/employees/{id}/{name}/{age}", method = RequestMethod.GET)
    @ResponseBody
    public Employee info3(Employee employee){   // 这里自动放入employee对象中了,等于@PathVariable Long id, @PathVariable String name, @PathVariable int age
        return employee;
    }

【RESTful API】RESTful接口设计练习_第24张图片

3.3 参数路径扩展

【RESTful API】RESTful接口设计练习_第25张图片

【RESTful API】RESTful接口设计练习_第26张图片

3.4 页面请求接口

需求:页面有五个按钮,点击发起异步请求,访问对应restful接口。

1. 用jquery的方式绑定事件:导入jquery.js

【RESTful API】RESTful接口设计练习_第27张图片

/*! jQuery [email protected] jquery.com | jquery.org/license */
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.1",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()==

你可能感兴趣的:(REST,restful,后端)