百木园-与人分享,
就是让自己快乐。

Restful风格

Restful

1.REST架构的主要原则

1.1 对网络上所有的资源都有一个资源标志符
1.2 对资源的操作不会改变标识符
1.3 同一资源有多种表现形式(xml、json)、
1.4 所有操作都是无状态的(Stateless)

符合上述REST原则的架构方式称为Restful

2.URI和URL区别

URI:http://example.com/users/
URL:http://example.com/users/{user} (one for each user)

2.1.什么是无状态性

​ 使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前的请求,不需了解请求的历史。可以更容易的释放资源,让服务器利用Pool(连接池)技术来提高稳定性和性能。

3.Restful操作

RESTful是一种常见的REST应用,是遵循REST风格的web服务,REST式的web服务是一种ROA(面向资源的架构)。更加安全!!

http方法 资源操作 幂等 安全
GET SELECT
POST INSERT
PUT UPDATE
DELETE DELETE

注:幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。

​ 安全性:对该REST接口访问,不会使服务器端资源的状态发生改变。

3.1接口示例

传统URL请求格式:
http:/127.0.0.1/test/query/2 http:/127.0.0.1/test/query?id=1 GET 根据用户id查询用户数据

http:/127.0.0.1/test/save POST 新增用户

http:/127.0.0.1/test/update POST 修改用户信息

http:/127.0.0.1/test/delete GET/POST 删除用户信息

RESTful请求格式:
http:/127.0.0.1/test/1 GET 根据用户id查询用户数据

http:/127.0.0.1/test POST 新增用户

http:/127.0.0.1/test PUT 修改用户信息

http:/127.0.0.1/test/1 DELETE 删除用户信息

4.Http状态码

4.1一般情况:

200:请求响应成功 200

3xx:请求重定向 重定向:你重新到我给你新位置去;

4xx:找不到资源 404 资源不存在;

5xx:服务器代码错误 500 502:网关错误

4.2具体情况:

HttpStatus = {  
        //Informational 1xx  信息
        \'100\' : \'Continue\',  //继续
        \'101\' : \'Switching Protocols\',  //交换协议
 
        //Successful 2xx  成功
        \'200\' : \'OK\',  //OK
        \'201\' : \'Created\',  //创建
        \'202\' : \'Accepted\',  //已接受
        \'203\' : \'Non-Authoritative Information\',  //非权威信息
        \'204\' : \'No Content\',  //成功,但没有内容
        \'205\' : \'Reset Content\',  //重置内容
        \'206\' : \'Partial Content\',  //部分内容
 
        //Redirection 3xx  重定向
        \'300\' : \'Multiple Choices\',  //多种选择
        \'301\' : \'Moved Permanently\',  //永久移动
        \'302\' : \'Found\',  //找到
        \'303\' : \'See Other\',  //参见其他
        \'304\' : \'Not Modified\',  //未修改
        \'305\' : \'Use Proxy\',  //使用代理
        \'306\' : \'Unused\',  //未使用
        \'307\' : \'Temporary Redirect\',  //暂时重定向
 
        //Client Error 4xx  客户端错误
        \'400\' : \'Bad Request\',  //错误的请求
        \'401\' : \'Unauthorized\',  //未经授权
        \'402\' : \'Payment Required\',  //付费请求
        \'403\' : \'Forbidden\',  //禁止
        \'404\' : \'Not Found\',  //没有找到
        \'405\' : \'Method Not Allowed\',  //方法不允许
        \'406\' : \'Not Acceptable\',  //不可接受
        \'407\' : \'Proxy Authentication Required\',  //需要代理身份验证
        \'408\' : \'Request Timeout\',  //请求超时
        \'409\' : \'Conflict\',  //指令冲突
        \'410\' : \'Gone\',  //文档永久地离开了指定的位置
        \'411\' : \'Length Required\',  //需要Content-Length头请求
        \'412\' : \'Precondition Failed\',  //前提条件失败
        \'413\' : \'Request Entity Too Large\',  //请求实体太大
        \'414\' : \'Request-URI Too Long\',  //请求URI太长
        \'415\' : \'Unsupported Media Type\',  //不支持的媒体类型
        \'416\' : \'Requested Range Not Satisfiable\',  //请求的范围不可满足
        \'417\' : \'Expectation Failed\',  //期望失败
 
        //Server Error 5xx  服务器错误
        \'500\' : \'Internal Server Error\',  //内部服务器错误
        \'501\' : \'Not Implemented\',  //未实现
        \'502\' : \'Bad Gateway\',  //错误的网关
        \'503\' : \'Service Unavailable\',  //服务不可用
        \'504\' : \'Gateway Timeout\',  //网关超时
        \'505\' : \'HTTP Version Not Supported\'  //HTTP版本不支持
};  

5.测试

@Controller
public class RestFulController {
    //映射访问路径
    @RequestMapping(\"/commit/{p1}/{p2}\")
    //在SpringMVC中可以使用 @PathVariable,让方法参数的值对应绑定到一个URI变量上
    public ModelAndView index(@PathVariable int p1, @PathVariable int p2, ModelAndView mv){
        int result = p1 + p2;
        //实例化一个ModelAndView对象用于向视图中传值
        mv.addObject(\"msg\",\"结果:\" + result);
        //返回视图
        mv.setViewName(\"test\");
        return mv;
    }
}

也可以使用method属性指定类型

@RequestMapping(value = \"/hello\",method = {RequestMethod.POST})
public String index2(Model model){
   model.addAttribute(\"msg\", \"hello!\");
   return \"test\";
}

但浏览器地址栏进行访问是通过GET方式进行的 ,我们定义的是POST方法-所以报错不匹配

改为GET

@RequestMapping(value = \"/hello\",method = {RequestMethod.GET})
//我们一般采用这种方式:@GetMapping(\"/hello\")
public String index2(Model model){
   model.addAttribute(\"msg\", \"hello!\");
   return \"test\";
}

我们可以看到Method 方式太长,不方便,我们可以用延伸的方法

@GetMapping:扮演的是@RequestMapping(method =RequestMethod.GET) 的快捷方式。
@PostMapping (method =RequestMethod.GET)
@PutMapping  (method =RequestMethod.POST)
@DeleteMapping (method =RequestMethod.DELETE)
@PatchMapping  (method =RequestMethod.PATCH)

如:

如果是地址栏输入(GET)可以调用 index方法:
@GetMapping(\"/commit/{p1}/{p2}\")
    //在SpringMVC中可以使用 @PathVariable,让方法参数的值对应绑定到一个URI变量上
    public ModelAndView index(@PathVariable int p1, @PathVariable int p2, ModelAndView mv){
        int result = p1 + p2;
        //实例化一个ModelAndView对象用于向视图中传值
        mv.addObject(\"msg\",\"结果1:\" + result);
        //返回视图
        mv.setViewName(\"test\");
        return mv;
    }
如果前端页面form表单 method为POST,则调用index2方法
@PostMapping(\"/commit/{p1}/{p2}\")
    //在SpringMVC中可以使用 @PathVariable,让方法参数的值对应绑定到一个URI变量上
    public ModelAndView index2(@PathVariable int p1, @PathVariable int p2, ModelAndView mv){
        int result = p1 + p2;
        //实例化一个ModelAndView对象用于向视图中传值
        mv.addObject(\"msg\",\"结果2:\" + result);
        //返回视图
        mv.setViewName(\"test\");
        return mv;
    }

来源:https://www.cnblogs.com/JayZzzWh/p/16602501.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Restful风格

相关推荐

  • 暂无文章