Restful风格

今天看到一个比较好的文章,记录一下:html

Restful风格API中用put仍是post作新增操做有什么区别?

1 HTTP协议详解

HTTP协议一般承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了咱们常说的HTTPS。以下图所示:数据库

            

 

默认HTTP的端口号为80,HTTPS的端口号为443。浏览器

HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:
     安全

这样就限制了使用HTTP协议,没法实如今客户端没有发起请求的时候,服务器将消息推送给客户端。服务器

HTTP协议是一个无状态的协议,同一个客户端的此次请求和上次请求是没有对应关系。网络

一次HTTP操做称为一个事务,其工做过程可分为四步:架构

1)首先客户机与服务器须要创建链接。只要单击某个超级连接,HTTP的工做开始。ide

2)创建链接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。post

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。性能

4)客户端接收服务器所返回的信息经过浏览器显示在用户的显示屏上,而后客户机与服务器断开链接。

若是在以上过程当中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来讲,这些过程是由HTTP本身完成的,用户只要用鼠标点击,等待信息显示就能够了。

2  HTTP协议详解之请求篇

  http请求由三部分组成,分别是:请求行、消息报头、请求正文

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式以下:Method Request-URIHTTP-Version CRLF  
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了做为结尾的CRLF外,不容许出现单独的CR或LF字符)。

请求方法(全部方法全为大写)有多种,各个方法的解释以下:
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用Request-URI做为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留未来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

POST方法要求被请求服务器接受附在请求后面的数据,经常使用于提交表单。

HEAD方法与GET方法几乎是同样的,对于HEAD请求的回应部分来讲,它的HTTP头部中包含的信息与经过GET请求所获得的信息是相同的。利用这个方法,没必要传输整个资源内容,就能够获得Request-URI所标识的资源的信息。该方法经常使用于测试超连接的有效性,是否能够访问,以及最近是否更新。

3  HTTP协议详解之响应篇

在接收和解释请求消息后,服务器返回一个HTTP响应消息。

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
一、状态行格式以下:

HTTP-VersionStatus-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操做
4xx:客户端错误--请求有语法错误或请求没法实现
5xx:服务器端错误--服务器未能实现合法的请求
二、常见状态代码、状态描述、说明:

请求收到,继续处理
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
操做成功收到,分析、接受
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不肯定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
完成此请求必须进一步处理
300——请求的资源可在多处获得
301——删除请求数据
302——在其余地址发现了请求数据
303——建议客户访问其余URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址获得
306——前一版本HTTP中使用的代码,现行版本中再也不使用
307——申明请求的资源临时性删除
请求包含一个错误语法或不能完成
400——错误请求,如语法错误
401——未受权
HTTP 401.1 - 未受权:登陆失败
   HTTP 401.2 - 未受权:服务器配置问题致使登陆失败
   HTTP 401.3 - ACL 禁止访问资源
   HTTP 401.4 - 未受权:受权被筛选器拒绝
HTTP 401.5 - 未受权:ISAPI 或 CGI 受权失败
402——保留有效ChargeTo头响应
403——禁止访问
HTTP 403.1 禁止访问:禁止可执行访问
   HTTP 403.2 - 禁止访问:禁止读访问
   HTTP 403.3 - 禁止访问:禁止写访问
   HTTP 403.4 - 禁止访问:要求 SSL
   HTTP 403.5 - 禁止访问:要求 SSL128
   HTTP 403.6 - 禁止访问:IP 地址被拒绝
   HTTP 403.7 - 禁止访问:要求客户证书
   HTTP 403.8 - 禁止访问:禁止站点访问
   HTTP 403.9 - 禁止访问:链接的用户过多
   HTTP 403.10 - 禁止访问:配置无效
   HTTP 403.11 - 禁止访问:密码更改
   HTTP 403.12 - 禁止访问:映射器拒绝访问
   HTTP 403.13 - 禁止访问:客户证书已被吊销
   HTTP 403.15 - 禁止访问:客户访问许可过多
   HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者还没有生效
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不容许
406——根据用户发送的Accept拖,请求资源不可访问
407——相似401,用户必须首先在代理服务器上获得受权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上再也不有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器容许的大小
414——请求的资源URL长于服务器容许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不知足请求Expect头字段指定的指望值,若是是代理服务器,多是下一级服务器不能知足请求长。
服务器执行一个彻底有效请求失败
   HTTP 500 - 内部服务器错误
   HTTP 500.100 - 内部服务器错误 -ASP 错误
   HTTP 500-11 服务器关闭
   HTTP 500-12 应用程序从新启动
   HTTP 500-13 - 服务器太忙
   HTTP 500-14 - 应用程序无效
   HTTP 500-15 - 不容许请求 global.asa
   Error 501 - 未实现
        HTTP 502 - 网关错误
   HTTP 500.100 - 内部服务器错误 -ASP 错误
   HTTP 500-11 服务器关闭
   HTTP 500-12 应用程序从新启动
   HTTP 500-13 - 服务器太忙
   HTTP 500-14 - 应用程序无效
   HTTP 500-15 - 不容许请求 global.asa
   Error 501 - 未实现
        HTTP 502 - 网关错误

4 API设计的基本要求

  一个被广泛认可和遵照:RESTful设计原则。它被Roy Felding提出(在他的”基于网络的软件架构“论文中第五章)。而REST的核心原则是将你的API拆分为逻辑上的资源。这些资源经过http被操做(GET ,POST,PUT,DELETE)。
    显然从API用户的角度来看,”资源“应该是个名词。即便你的内部数据模型和资源已经有了很好的对应,API设计的时候你仍然不须要把它们一对一的都暴露出来。这里的关键是隐藏内部资源,暴露必需的外部资源。
    一旦定义好了要暴露的资源,你能够定义资源上容许的操做,以及这些操做和你的API的对应关系:

·       GET /tickets # 获取ticket列表

·       GET /tickets/12 # 查看某个具体的ticket

·       POST /tickets # 新建一个ticket

·       PUT /tickets/12 # 更新ticket 12.

·       DELETE /tickets/12 #删除ticekt 12

    能够看出使用REST的好处在于能够充分利用http的强大实现对资源的CURD功能。而这里你只须要一个endpoint:/tickets,再没有其余什么命名规则和url规则了,cool!
    可是有的endpoint,须要使用复数使得你的URL更加规整。这让API使用者更加容易理解,对开发者来讲也更容易实现。
如何处理关联?关于如何处理资源之间的管理REST原则也有相关的描述:

·       GET /tickets/12/messages- Retrieves list of messages forticket #12

·       GET /tickets/12/messages/5- Retrieves message #5 forticket #12

·       POST /tickets/12/messages- Creates a new message inticket #12

·       PUT /tickets/12/messages/5- Updates message #5 for ticket#12

·       PATCH /tickets/12/messages/5- Partially updates message#5 for ticket #12

·       DELETE /tickets/12/messages/5- Deletes message #5 forticket #12

    其中,若是这种关联和资源独立,那么咱们能够在资源的输出表示中保存相应资源的endpoint。而后API的使用者就能够经过点击连接找到相关的资源。若是关联和资源联系紧密。资源的输出表示就应该直接保存相应资源信息。(例如这里若是message资源是独立存在的,那么上面 GET/tickets/12/messages就会返回相应message的连接;相反的若是message不独立存在,他和ticket依附存在,则上面的API调用返回直接返回message信息)

5 get和post区别

    经常使用的请求方式是GET和POST.

GET方式:是以实体的方式获得由请求URI所指定资源的信息,若是请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。

POST方式:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它看成请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:

1)对现有资源的解释;

2)向电子公告栏、新闻组、邮件列表或相似讨论组发信息;

3)提交数据块;

4)经过附加操做来扩展数据库 。

从上面描述能够看出,Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。

GET与POST方法有如下区别:

1)   在客户端,Get方式在经过URL提交数据,数据在URL中能够看到;POST方式,数据放置在HTMLHEADER内提交。

2)  GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。因此,若是这些数据是中文数据并且是非敏感数据,那么使用 get;若是用户输入的数据不是中文字符并且包含敏感数据,那么仍是使用 post为好。

4)   安全的和幂等的。所谓安全的意味着该操做用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回一样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求通常不该产生反作用。从根本上讲,其目标是当用户打开一个连接时,她能够确信从自身的角度来看没有改变资源。好比,新闻站点的头版不断更新。虽然第二次请求会返回不一样的一批新闻,该操做仍然被认为是安全的和幂等的,由于它老是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该经过 POST 请求实现,由于在注解提交以后站点已经不一样了(比方说文章下面出现一条注解)。

6 put和post区别

  有的观点认为,应该用POST来建立一个资源,用PUT来更新一个资源;有的观点认为,应该用PUT来建立一个资源,用POST来更新一个资源;还有的观点认为能够用PUT和POST中任何一个来作建立或者更新一个资源。这些观点都只看到了风格,争论起来也只是争论哪一种风格更好,其实,用PUT仍是POST,不是看这是建立仍是更新资源的动做,这不是风格的问题,而是语义的问题。  举一个简单的例子,假若有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/{blog-name},很简单,将{blog-name}替换为咱们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。咱们应该用PUT方法仍是POST方法?取决于这个REST服务的行为是不是idempotent的,假如咱们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?若是产生了两个博客帖子,那就说明这个服务不是idempotent的,由于屡次使用产生了反作用了嘛;若是后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种状况,应该使用POST方法,后一种状况,应该使用PUT方法。

相关文章
相关标签/搜索