Http协议详解

来源:互联网 发布:isql 连接数据库 编辑:程序博客网 时间:2024/06/06 00:08

OSI七层网络协议:

物理层:传输介质

数据链路层:ATM

网络层:IP

传输层:TCP(面向连接,三次握手),UDP(非面向连接)

会话层:开始、控制和结束一个会话,让上层看起来是连续的

表示层:定义数据格式和加密

应用层:Http

 

Http是基于请求与响应模式的、无状态的、TCP连接方式。

既然是请求与响应模式,那么报文来回就被拆分为RequestResponse

 

先看Request

HttpRequest由请求行、报头、请求正文三部分组成

请求行:方法名(空格)请求的URL(空格)协议版本号(空格)CRLF

                  方法名包括GETPOSTHEADPUTDELETE等(webserviceREST

                  例子:POST/form.html HTTP/1.1 CRLF

请求报头:

Accept:表明客户端希望接受

Accept-Charset:字符集

Accept-Encoding:编码格式

Accept-Language:语言

Authorization:鉴权

Host:请求的地址

User-Agent:客户自定义的,一般放浏览器的信息

请求正文后面详解。

 

再看Response

HttpResponse状态行、报头、响应正文三部分组成

状态行:协议版本号(空格)状态CODE(空格)状态说明(空格)CRLF

                  200+成功

                  300+重定向

                  400+客户端错误

                  500+服务端错误

响应报头

        Location300+重定向的位置

        Server:有点类似User-Agent,服务器用来处理请求的软件信息

请求正文后面详解。

 

 

最后来看RequestResponse中的请求正文

请求和响应最终都要传送一个实体,也就是正文信息,实体报文又分为实体报头和实体正文。

实体报头:

Content-Encoding:实体正文的编码

Content-Language:实体正文的语言

Content-Length:实体正文的长度

Content-Type:实体正文的类型,例如text/html;charset=GB2312

实体正文:没什么好讲的,真正有用的信息。

什么?没听明白?上两张图就能明白了。

 

HttpRequest

HttpResponse

 

 

了解了报文的组成我们来看下GETPOST区别

在协议上GET方法传递的参数直接在请求行的URL里,直接在地址栏显示,POST传递的参数在实体报文的正文里,不会在浏览器中显示,所以POST安全性较高,但是一旦被抓包,安全性都是一样。

 

最后了解下Http请求的几种方法:

1.      OPTIONS

Web服务器发送'*'的请求来询问服务器支持哪些请求方法。

2.      HEAD

不返回报文主体部分,一般作为连通性测试。

这个方法虽然不常用,但是我对这个方法有较深的印象,在开发Spring Cloud Feign的时候犯过一次错误,如下

@RequestMapping(value="/feign-service/serviceHead", method=RequestMethod.HEAD)String helloService(@RequestHeader("name") String name,@RequestHeader("password") String password);

        虽然这个方法定义了String类型的返回值,但是当作为服务被client调用时是拿不到这个返回值的,因为HEAD方法不返回报文的主体。

3.      GET

安全的、幂等的,不会影响服务内部数据,多次查询结果相同,意义在于获取内容

4.      POST

非等幂,不安全自定义方法。

5.      PUT

幂等,Mapput方法,做新建和修改,意义在于saveOrUpdate

6.      DELETE

删除服务器上标识资源

7.      TRACE

回显服务器内容,多做诊断和测试

8.      CONNECT

CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。

 

最后再拿出PostPut这两个在效果上看似类似,但是在协议设计上完全不同的两个方法来比较下。

PUT,安全幂等的,该方法用于资源的新增和修改,就跟Map中的Put一样,无则加之,有则改之,但也正是由于这一特性,它要求实体报文中要包含资源的全部内容。

POST,非安全非幂等,该方法说白了开放给开发者随便搞,例如我们常用的登陆验证、资源局部修改、action自定义请求等,甚至说我对POST的处理也是跟对PUT的处理一样,每次都传全量的资源内容,服务端新建或者替换,那都是你自己的设计和用法,但是不能改变非安全非幂等的出身。哎,虽然很灵活,但是很卑微。

原创粉丝点击