Restful接口设计

/ 冷姿势 / 1 条评论 / 562人围观

Rest简述

REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。

Restful简述

对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构)。

Restful特性

普通架构

每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save。如:

https://127.0.0.1/user/query/1 GET 根据用户id查询用户数据

https://127.0.0.1/user/save POST 新增用户

Restful架构

使用get请求,就是查询.使用post请求,就是新增的请求,意图明显,没有必要做描述,这就是restful。

https://127.0.0.1/user/1 GET 根据用户id查询用户数据

https://127.0.0.1/user POST 新增用户

Restful操作方式

HTTP方法资源操作幂等性是否安全
GET查询
POST新增
PUT修改
DELETE删除

幂等性:多次访问,结果资源状态是否相同

安全:访问是否会变更服务器资源状态

相应状态码

编码HTTP方法响应体内容描述
200get/put资源数据操作成功
201post源数据创建成功
202post/put/delete请求已接受
204delete/put请求已处理,无返回数据
301getlink 链接资源已被移除
303getlink重定向
304get资源没有被修改
400get/post/put/delete错误提示消息参数错误(缺少,格式错误等)
401get/post/put/delete错误提示消息未授权
403get/post/put/delete错误提示消息访问受限、授权过期
404get/post/put/delete错误提示消息资源、服务未找到
405get/post/put/delete错误提示消息不允许的HTTP方法
409get/post/put/delete错误提示消息资源冲突或资源被锁定
415get/post/put/delete错误提示消息不支持的数据类型或媒体类型
429get/post/put/delete错误提示消息请求过多被限制
500get/post/put/delete错误提示消息系统错误
501get/post/put/delete错误提示消息接口未实现

SpringMVC使用Restful实例

function add(){
	$.ajax({
		'url':'${pageContext.request.contextPath}/user',
		'type':'post',
		'data':'user={id:10,name:test}',
		'success':function(data){
			alert(data);
		}
	});
}
    /** 
     * 新增用户 
     *  create by 70KG
     * @param user 
     * @return 
     */  
    @RequestMapping(method = RequestMethod.POST)  
    public ResponseEntity<Void> saveUser(String user) {  
        try {  
            this.newUserService.saveUser(user);  
            return ResponseEntity.status(HttpStatus.CREATED).build();  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        // 500  
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    }

function del(){
	$.ajax({
		'url':'${pageContext.request.contextPath}/user?id=3',
		'type':'delete',
		'success':function(data){
			alert(data);
		}
	});
}
    /** 
     * 删除用户资源 
     *  create by 70KG
     * @param user 
     * @return 
     */  
    @RequestMapping(method = RequestMethod.DELETE)  
    public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) {  
        try {  
            if (id.intValue() == 0) {  
                // 请求参数有误  
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();  
            }  
            this.newUserService.deleteUserById(id);  
            // 204  
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        // 500  
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    }

function modify(){
	$.ajax({
		'url':'${pageContext.request.contextPath}/user',
		'type':'put',
		'data':'user={id:1,name:guest}',
		'success':function(data){
			alert(data);
		}
	});
}
    /** 
     * 更新用户资源 
     *  create by 70KG
     * @param user 
     * @return 
     */  
    @RequestMapping(method = RequestMethod.PUT)  
    public ResponseEntity<Void> updateUser(String user) {  
        try {  
            this.newUserService.updateUser(user);  
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        // 500  
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    } 

function get(){
	$.ajax({
		'url':'${pageContext.request.contextPath}/user/1',
		'type':'get',
		'success':function(data){
			alert(data);
		}
	});
}
    /** 
     * 根据用户id查询用户数据 
     *  create by 70KG
     * @param id  path variable参数
     * @return 
     */  
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)  
    @ResponseBody  
    public ResponseEntity<String> queryUserById(@PathVariable("id") Long id) {  
        try {  
        	String user = this.newUserService.queryUserById(id);  
            if (null == user) {  
                // 资源不存在,响应404  
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);  
            }  
            // 200  
            // return ResponseEntity.status(HttpStatus.OK).body(user);  
            return ResponseEntity.ok(user);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        // 500  
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    }
  1. 界面还有#没有被解析

    回复