Http协议详解
来源:互联网 发布:isql 连接数据库 编辑:程序博客网 时间:2024/06/06 00:08
OSI七层网络协议:
物理层:传输介质
数据链路层:ATM等
网络层:IP等
传输层:TCP(面向连接,三次握手),UDP(非面向连接)
会话层:开始、控制和结束一个会话,让上层看起来是连续的
表示层:定义数据格式和加密
应用层:Http等
Http是基于请求与响应模式的、无状态的、TCP连接方式。
既然是请求与响应模式,那么报文来回就被拆分为Request和Response。
先看Request
HttpRequest由请求行、报头、请求正文三部分组成
请求行:方法名(空格)请求的URL(空格)协议版本号(空格)CRLF
方法名包括GET、POST、HEAD、PUT、DELETE等(webservice的REST)
例子: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+服务端错误
响应报头:
Location:300+重定向的位置
Server:有点类似User-Agent,服务器用来处理请求的软件信息
请求正文后面详解。
最后来看Request和Response中的请求正文
请求和响应最终都要传送一个实体,也就是正文信息,实体报文又分为实体报头和实体正文。
实体报头:
Content-Encoding:实体正文的编码
Content-Language:实体正文的语言
Content-Length:实体正文的长度
Content-Type:实体正文的类型,例如text/html;charset=GB2312
实体正文:没什么好讲的,真正有用的信息。
什么?没听明白?上两张图就能明白了。
HttpRequest:
HttpResponse:
了解了报文的组成我们来看下GET和POST区别
在协议上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
幂等,Map的put方法,做新建和修改,意义在于saveOrUpdate。
6. DELETE
删除服务器上标识资源
7. TRACE
回显服务器内容,多做诊断和测试
8. CONNECT
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
最后再拿出Post和Put这两个在效果上看似类似,但是在协议设计上完全不同的两个方法来比较下。
PUT,安全幂等的,该方法用于资源的新增和修改,就跟Map中的Put一样,无则加之,有则改之,但也正是由于这一特性,它要求实体报文中要包含资源的全部内容。
POST,非安全非幂等,该方法说白了开放给开发者随便搞,例如我们常用的登陆验证、资源局部修改、action自定义请求等,甚至说我对POST的处理也是跟对PUT的处理一样,每次都传全量的资源内容,服务端新建或者替换,那都是你自己的设计和用法,但是不能改变非安全非幂等的出身。哎,虽然很灵活,但是很卑微。
- 【http】http协议详解
- 网络协议-HTTP协议详解
- HTTP协议-http事务详解
- HTTP协议详解----HTTP消息
- Http协议详解
- HTTP协议详解
- HTTP协议头详解
- HTTP协议头详解
- HTTP协议详解
- HTTP协议详解
- http协议详解
- HTTP协议详解
- HTTP协议详解
- HTTP协议详解
- HTTP协议详解
- HTTP协议详解
- HTTP协议详解
- HTTP协议详解
- 差分隐私及其在位置隐私保护的应用
- C++ memset() 只能初始化为0或-1
- iptables简单一些的用法
- 文件系统操作命令(打包,压缩,传输)
- numa的内存按节点分配和线程绑定
- Http协议详解
- Linux/CentOS环境下如何安装和配置PhantomJS工作环境
- java中Scanner类nextLine()和next()的区别和使用方法
- hihocoder 1142(三分)
- eclipse查看一个方法被谁引用(调用)的快捷键四种方式
- rvm use 经常报错,找不到命令
- android studio 性能分析工具总结
- Android Anim动画
- 多个框架问题的自我整理与理解