草庐IT

Restful风格

JayZzzWh 2023-04-19 原文

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;
    }

有关Restful风格的更多相关文章

  1. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  2. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

  3. Ruby:如何将数组拼接成 Lisp 风格的列表? - 2

    这是我发现自己偶尔想做的事情。假设我有一个参数列表。在Lisp中,我可以像这样`(imaginary-function,@args)为了调用将数组从一个元素转换为正确数量的参数的函数。Ruby中是否有类似的功能?或者我只是在这里使用了一个完全错误的成语? 最佳答案 是的!它被称为splat运算符。a=[1,44]p(*a) 关于Ruby:如何将数组拼接成Lisp风格的列表?,我们在StackOverflow上找到一个类似的问题: https://stackov

  4. ruby-on-rails - Restful 命令 - 2

    我是RESTful的新手。但是,我想在我的Rails应用程序中使用它。当我将它添加到我的routes.rbmap.resources:notes时,我得到了创建这些方法的路由:索引创建新编辑展示更新摧毁我想知道编辑/更新和创建/新建之间有什么区别?对于这些方法对如何变化以及每个方法对的作用,是否有任何标准定义? 最佳答案 标准定义如下:index-GET-所有(或部分)记录的Viewshow-GET-单个记录的View新-GET-发布以创建的表单创建-POST-创建新记录edit-GET-用于编辑单个记录的表单更新-PUT-更新记录

  5. ruby-on-rails - Ruby on Rails URL 中的资源映射(RESTful API) - 2

    我很难给出正确的答案,所以我会在这里征求我的问题。我正在研究RESTFulAPI。自然地,我有多种资源,其中一些由父子关系组成,一些是独立资源。我有点困难的地方是弄清楚如何让那些将根据我的API构建客户端的人更容易。情况是这样的。假设我有一个“街道”资源。每条街道都有多个住宅。SoStreet:has_manytoHomes和Homes:belongs_toStreet。如果用户想要在特定的home资源上请求HTTPGET,以下应该可行:http://mymap/streets/5/homes/10这允许用户获取ID为10的房屋的信息。直截了当。我的问题是,我授予用户访问权限是否违反了

  6. ruby - 关于 Ruby/ChefSpec 编码风格的反馈 - 2

    我是Ruby的新手,但过去两周我一直在对Chef测试进行大量研究。该测试使用ChefSpec和Fauxhai,但它看起来不是很“像ruby”,我希望社区能给我一些编码风格的建议。有没有更好的方法来编写这样的嵌套循环?Recipe/foo/recipes/default.rbpackage"foo"doaction:installendRecipe/foo/spec/default_spec.rbrequire'chefspec'describe'foo::default'doplatforms={"debian"=>['6.0.5'],"ubuntu"=>['12.04','10.04

  7. 好的代码风格,如同书法,让你的代码更加漂亮 - 2

    很多初学者的代码其实都不够“漂亮”,那是因为没有养成好的编码习惯。本篇博客以C语言为例,总结一些好习惯。其实,很多习惯都是肌肉记忆,举个例子:请你写一个程序,输入2个整数并输出它们的和。有些朋友可能写出来是这个样子。#includeintmain(){ inta=0; intb=0; intsum=0; scanf("%d%d",&a,&b); sum=a+b; printf("%d\n",sum); return0;}我写这段代码,是在模仿有些朋友在初学的时候容易写成的样子。更有甚者,写成这个样子:#includeintmain(){inta=0;intb=0;intsum=0;scanf(

  8. ruby - 为什么 REPL 风格的开发在 Ruby 中并不常见? - 2

    看起来Lisp和Clojure程序员经常直接在REPL中开发程序。比照。ClojureDevelopment:IDEorREPL?我的问题是,为什么这种方法在Ruby中不是更常见,通过irb?这仅仅是文化差异,还是有结构(特定于语言)的原因导致以REPL为中心的开发在Lisp中比在Ruby和Python等语言中更常见? 最佳答案 Lisp语法似乎非常适合组合REPL和源文件的方法。当每个表单的文本限制很明确时,以编程方式移动代码片段会容易得多。 关于ruby-为什么REPL风格的开发在R

  9. ruby - 如何从 ruby​​ 中取消转义 c 风格的转义序列? - 2

    在ruby​​中,我如何解码c风格的转义序列?例如'\n'到换行符,'\t'到制表符? 最佳答案 好吧,如果你不喜欢eval解决方案,我已经在Ruby中破解了一个简单的状态机来正确解析字符串中的简单“\n”和“\t”,包括预转义反斜杠本身。在这里:BACKSLASH="\\"defunescape_c_string(s)state=0res=''s.each_char{|c|casestatewhen0casecwhenBACKSLASHthenstate=1elseres这个可以轻松扩展以支持更多字符,包括多字符实体,如\123。

  10. ruby-on-rails - Restful_authentication 与 Authlogic - 2

    你有什么建议?Authlogic还是restful_authentication?将电子邮件激活步骤构建到authlogic中很难吗(据我所知,Authlogic没有包含此功能)。 最佳答案 实际上,我不同意无花果肉block。您可以做几件事。如果你想要一个基本的解决方案,请尝试restfulauth,但要注意基于生成器的方法有很大的缺点。主要缺点是您将大量代码喷射到您的应用程序中。因此,当出现问题时,您必须手动修补代码或取消您所做的任何定制。最新版本的restfulauth比早期版本好得多,早期版本向左、向右和中间喷出代码,但我的

随机推荐