HTTP之为什么存在post,get,put,delete等多种类型请求(RESTful风格介绍)

摘要:
1、 HTTP定义了以下请求方法:因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。进程中的每个节点都可以修改原始HTTP请求。TRACE方法允许客户端在向服务器发送请求的过程中查看HTTP请求消息

一、HTTP中定义了以下几种请求方法:

1、GET;2、POST;3、PUT;4、DELETE;
5、HEAD;6、TRACE;7、OPTIONS;

二、各个方法介绍:

1、GET方法:对这个资源的查操作。

2、DELETE方法:对这个资源的删操作。但要注意:客户端无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客

户端的情况下撤销请求。

3、HEAD方法:与GET方法的行为很类似,但服务器在响应中只返回实体的主体部分。这就允许客户端在未获取实际资源的情

况下,对资源的首部进行检查,使用HEAD,我们可以更高效的完成以下工作:

在不获取资源的情况下,了解资源的一些信息,比如资源类型;

通过查看响应中的状态码,可以确定资源是否存在;

通过查看首部,测试资源是否被修改;

4、TRACE方法:会在目的服务器端发起一个“回环”诊断,我们都知道,客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关、或者其它的一些应用程序。这中间的每个节点都可能会修改原始的HTTP请求,TRACE方法允许客户端在最终将请求发送服务器时,它变成了什么样子。由于有一个“回环”诊断,在请求最终到达服务器时,服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文的最终模样。这样客户端就可以查看HTTP请求报文在发送的途中,是否被修改过了。

5、OPTIONS方法:用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

二、方发之间的区别:

1、PUT和POST

PUT和POS都有更改指定URI的语义.但PUT被定义为idempotent的方法,POST则不是.idempotent的方法:如果一个方法重复执行

多次,产生的效果是一样的,那就是idempotent的。也就是说:

PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)

Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)

2、get和post

1、GET参数通过URL传递,POST放在Request body中。

2、GET请求会被浏览器主动cache,而POST不会,除非手动设置。

3、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

4、Get 请求中有非 ASCII 字符,会在请求之前进行转码,POST不用,因为POST在Request body中,通过 MIME,也就可以传输非 ASCII 字符。

5、 一般我们在浏览器输入一个网址访问网站都是GET请求

6、HTTP的底层是TCP/IP。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。但是请求的数据量太大对浏览器和服务器都是很大负担。所以业界有了不成文规定,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。

7、GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

8、在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。但并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

内容整理来源如下:

http://www.cnblogs.com/logsharing/p/8448446.html

http://www.cnblogs.com/shanyou/archive/2011/10/17/2215930.html

http://www.jellythink.com/archives/806
————————————————
版权声明:本文为CSDN博主「田园园野」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36183935/article/details/80570062

===================================================================================

目录

一、传统常用对数据操作API接口方式

1.请求URI路径命名与请求方式type混乱

2.混乱的URI命名与Type类型导致资源的来源复杂多样

3.状态性(我们一般访问的网页都是有状态)

4. 返回结果重定义

二、RESTful风格例子

1.URI请求命名规则与请求方式

2.返回状态码 

三、RESTful风格系统特点

1.CS结构

2.无状态

3.可缓存

4.分层系统

5.统一接口

6.按需代码(扩展性)可选

一、传统常用对数据操作API接口方式
1.请求URI路径命名与请求方式type混乱
一千个读者就有一千个哈姆雷特,大多数程序员在URI命名时都采取见明知意的方式,使用get或者post解决所有数据的CRUD,如以下方式

http://localhost:8080/mallWeb/getAllProducts    ---get查

http://localhost:8080/mallWeb/getSomeProductsById?id=10086    ---get查

http://localhost:8080/mallWeb/saveUserInfo    ---post增

http://localhost:8080/mallWeb/updateUserInfoById?id=10086    ---post改

http://localhost:8080/mallWeb/deleteUserInfoById?id=10086    ---post删

每个人都有自己命名的一套规则与请求方式,导致http协议显得混乱,甚至完全忽略了其他请求方式如put、delete等,如果不是因为get请求uri长度限制(一般为2kb),或许很多人通篇get请求,再无其它

2.混乱的URI命名与Type类型导致资源的来源复杂多样
混乱的URI命名导致一个独立的URI地址,无法对应一个独一无二的资源。一个资源,对应了多样v来源;你有没有想过这样一个环境,一个独立的URI地址,对应一个独一无二的资源(RESTful风格);比如:我是一名理发师,需要为顾客理发;定义如下URI:

/hairStyle/{customer_id},一个顾客就对应一套理发流程;如/hairStyle/mark,表示我现在需要为mark做一整套理发流程。现在再想想我们之前常用的命名方式

wash/hairStyle/mark,为mark顾客洗头

cut/hairStyle/mark,为mark顾客剪头

dry/hairStyle/mark,为mark顾客吹头

如果我们可以用/hairStyle/mark表示一整套流程,(已经定义了各种type)

如果你要为顾客洗头,追加type=wash;

如果你要为顾客剪头,追加type=cut;

如果你要为顾客剪头,追加type=dry;

这就是RESTful风格之一了,怎么样是不是很清爽呢!Http请求协议中有8中类型!!!想想你用了几种呢?

3.状态性(我们一般访问的网页都是有状态)
有状态:后面每一个状态都依赖于前面的状态,如果前面的无法访问,后面的也不会请求成功,如:

有状态:

员工登录OA系统----进入个人信息中心----进入薪资查询----输入密码----查询工资

如果其中的某个环节操作不成功,都无法查询工资成功

无状态(RESTful风格):

如果输入一个url即可得到指定员工的工资,则这种情况是无状态的,因为获取工资不依赖于其他资源或状态

http://oa.wasion.com/salary/mark,直接可以获取到mark的工资,这种就是无状态的

4. 返回结果重定义
我想很多人应该封装过如下实体吧,服务器返回错误信息都会封装在Http协议状态码中,我们依然还会错误信息封装在返回值中,返回的状态码一律都是200,返回了true或者false,前端拿到返回值后还要去解析到底是true还是false

public class Json implements java.io.Serializable {

private boolean success = false; //返回是否成功

private String msg = "";//返回消息

private Object obj = null;//返回数据


//get与set...

}
二、RESTful风格例子
1.URI请求命名规则与请求方式
GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,Delete用来删除资源

URI的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以RESTful风格中 通过 URI 暴露资源时,会强调不要在 URI 中出现动词

原始风格

http://localhost:8080/mallWeb/getAllproducts   ---Get (获取所有商品信息)

http://localhost:8080/mallWeb/getProductById?id=pro_id   ---Get (获取某个商品信息)

http://localhost:8080/mallWeb/SaveOneProduct    ---Post (添加一个商品信息)

http://localhost:8080/mallWeb/UpdateSomeproductsById?id=pro_id     ---Post(修改一个商品信息)

http://localhost:8080/mallWeb/DeleteSomeproductsById?id=pro_id     ---Post(删除一个商品信息)

RESTful风格 

http://localhost:8080/mallWeb/rest/api/products   ---Get (获取所有商品信息)

http://localhost:8080/mallWeb/rest/api/products/:pro_id   ---Get (获取某个商品信息)

http://localhost:8080/mallWeb/rest/api/products    ---Post (添加一个商品信息)

http://localhost:8080/mallWeb/rest/api/products/:pro_id    ---Put(修改一个商品信息)

http://localhost:8080/mallWeb/rest/api/products/:pro_id     ---Delete (删除一个商品信息)

URI名称 方法 描述
/orgz/members

GET

获取成员列表

/orgz/members/120

GET

获取单个成员

/orgz/members

POST

创建成员

/orgz/members/120

PUT

修改成员

/orgz/members

PUT

批量修改

/orgz/members/120

PATCH

修改成员的部分属性

/orgz/members/120

DELETE

删除成员

 2.返回状态码 
 返回值加入返回状态码(code),虽然Http请求本身已经有了完备的状态码,再定义一套状态码直观上感受却是不对劲。但是实际开发中,确实发现自定义业务状态码的必要性,如一次成功的Http status 200的请求,可能由于用户未登录、登录过期而有不同的返回结果和处理方式,所以还是保留了状态码(code)

public class Json implements java.io.Serializable {

private boolean success = false; //返回是否成功

private String msg = "";//返回消息

private Object obj = null;//返回数据

private String code = ""; //返回状态码

//get与set...

}
状态码的定义也最好有一套规范,如按照用户相关、授权相关、各种业务,做简单的分类 

// Code 业务自定义状态码定义示例

// 授权相关
1001: 无权限访问
1002: access_token过期
1003: unique_token无效
...

// 用户相关
2001: 未登录
2002: 用户信息错误
2003: 用户不存在

// 业务1
3001: 业务1XXX
3002: 业务1XXX
三、RESTful风格系统特点
1.CS结构
客户端-服务器结构

2.无状态
服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用

3.可缓存
服务器必须让客户知道请求是否可以被缓存

4.分层系统
服务器和客户之间的通信必须被这样标准化:允许服务器和客户之间的中间层(Ross:代理,网关等)可以代替服务器对客户的请求进行回应,而且这些对客户来说不需要特别支持

5.统一接口
客户和服务器之间通信的方法必须是统一化的(GET,POST,PUT,DELETE,etc)

6.按需代码(扩展性)可选
服务器可以提供一些代码或者脚本(Javascrpt,flash,etc)并在客户的运行环境中执行。这条准则是这些准则中唯一不必必须满足的一条。(比如客户可以在客户端下载脚本生成密码访问服务器。)
————————————————
版权声明:本文为CSDN博主「绣花针」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mmake1994/article/details/88633636

免责声明:文章转载自《HTTP之为什么存在post,get,put,delete等多种类型请求(RESTful风格介绍)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇01.SQLServer性能优化之----强大的文件组----分盘存储SVN报错下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

最近接了个小任务,和公司的iOS小伙伴们分享下instruments的具体使用,于是有了这篇博客...性能优化是一个很大的话题,这里讨论的主要是内存泄露部分。 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习... 1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变...

[Jimmy原创] 在.NET环境下操作MySQL数据库

        由于工作需要,最近需要在我的一个.NET程序里面对MySQL数据库进行操作,最简单的方法便是用ODBC连接,这是一个通用性很强的方法,但是这样做也有其缺点,就是软件部署的时候客户机也需要安装MySQL的ODBC驱动,以及做一些设定工作,这样对一般用户来说是比较困难的,就算你提供详尽的安装指南。那么能不能像我们在.NET环境里面使用ADO.N...

linux网络配置(ifcfg)

将linux主机接入到网络需要配置哪些配置项?   IP/NETMASK:本地通信。   路由(网管):跨网络通信。   DNS服务器地址:基于主机名通信。     DNS服务器有三种:主/备用DNS服务器/第三备份dns服务器。     DNS服务器指定需要修改配置文件/etc/resolv.conf     主机名配置:修改/etc/sysconfig...

[转]重建损坏的Windows Management Instrumentation(WMI)服务

安装SQL Server 2008 ,出现WMI服务错误。 解决方法,网上罗列两种: 一、重建损坏的Windows Management Instrumentation(WMI)服务(测试通过)@echo on cd /d c:\temp if not exist %windir%\system32\wbem goto TryInstall cd /d %...

GIT : IDEA切换到某个tag

背景看一本presto的书,发现版本用的是presto-0.107这个版本。然后我去Apache clone下源码,发现分支只有几个,但是下载页面却有很多不同的版本 然后看Tag发现有很多。 然后我现在需要 0.107版本的,发现上面没有,百度一下可以git到某个TAG点击后填入你的tag名称,我填写的是 0.107,然后就可以git到相关的代码了。 但是...

js中进行金额计算

js中进行金额计算parseFloat  在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题var price = 10.99;var quantity = 7;var needPay = parseFloat(price * quantity);needPay的正确结果应该是76.93元  但是运行后发现needPay为76....