主题
HTTP
特点
简单快速
:每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在 http 协议中,处理起来也比较简单,想访问什么资源,直接输入 url 即可灵活
:http 协议的头部有一个,数据类型,通过 http 协议,就可以完成不同数据类型的传输。无连接
:连接一次,就会断开,不会继续保持连接。无状态
:客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。
HTTP 报文组成
一、HTTP request 报⽂结构是怎样的
请求行
:请求方法、请求 URL、HTTP协议版本,CRLF(换行)请求头
:若⼲⾏请求头,包括general-header,request-header或者entity-header, 每个⼀⾏以 CRLF 结束空行
请求体
:根据实际请求需要可能包含⼀个消息实体
javascript
GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1
Host: www.w3.org
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/ User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, Referer: https://www.google.com.hk/)
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: authorstyle=yes
If-None-Match: "2cc8-3e3073913b100"
If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT
name=qiu&age=25
二、HTTP response 报⽂结构是怎样的
状态行
:HTTP版本,状态码,状态描述,CRLF响应头
空行
响应体
javascript
HTTP/1.1 200 OK
Date: Tue, 08 Jul 2014 05:28:43 GMT
Server: Apache/2
Last-Modified: Wed, 01 Sep 2004 13:24:52 GMT
ETag: "40d7-3e3073913b100"
Accept-Ranges: bytes
Content-Length: 16599
Cache-Control: max-age=21600 Expires: Tue, 08 Jul 2014 11:28:43 GMT P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"
Content-Type: text/html; charset=iso-8859-1
{"name": "qiu", "age": 25}
方法
GET
:请求服务器发送某个资源POST
:让资源在服务器上执行一系列操作,如创建新资源、更新资源、变更资源等。PUT
:跟 POST ⽅法很像,也是向服务器提交数据。但是, PUT 指定了资 源在服务器上的位置,⽽ POST 没有HEAD
:只请求⻚⾯的⾸部DELETE
:删除服务器上的某资源OPTIONS
:⽤于获取当前 URL 所⽀持的⽅法。如果请求成功,会有⼀个 Allow 的头包含类 似 “GET,POST” 这样的信息TRACE
:服务器回显收到的客户端请求,主要用于测试或诊断CONNECT
:预留给将连接转换为全双工通信连接
Get 和 Post 的区别
非 ajax 请求
如浏览器用GET请求来获取一个html页面/图片/css/js等资源;用POST来提交一个<form>
表单,并得到一个结果的网页
- get 的参数通过 url传递, post的参数放在 request body 中
- 由于 url 有长度限制,所以get传递的参数有长度限制, post没有
- get比 post更不安全,参数暴露在 url中,会被历史记录
- 浏览器在回退时,get不会重新请求,但是post会重新请求
ajax 请求
get 和 post 已经没有太多的区别了
- get 请求的参数可以放在请求体里,post 请求的参数同样可以放在 url 上
为了规范接口风格。则有了一些约定,如 REST
- get 请求专用于获取资源或者资源列表,请求参数放在 url 上。如果响应报文头部有 Caching,则浏览器同样会缓存下来
- post 请求用于“创建一个资源”,请求参数放在 request body 上
- PUT 请求用于更新/替换一个资源,请求参数放在 request body 上,则一般有 id
- DELETE 请求用于删除一个资源
共同
get产生一个 TCP数据包, 而 post可能产生两个 TCP数据包
post 会先发送头部,让服务器验证头部某些参数(如权限,名称)后,如果能继续执行,会响应 100 状态码,然后 post 再发送一次请求体。如果验证不正确,则会响应 400 状态,不再发送请求体
状态码
1XX :信息状态码
100 Continue
继续,⼀般在发送 post 请求时,已发送了 http header 之后服务端 将返回此信息,表示确认,之后发送具体参数信息
2XX:成功状态码
200 OK
正常返回信息204 No Contetn
请求成功,但在返回的响应报文中不含实体的主体部分206 Partial Content
客户端进行了范围(Content-Range)请求,而服务器成功执行了这部分的 GET 请求
3XX:重定向
301 Moved Permanently
永久重定向,请求的资源已被分配了新的 URI,会改变保存书签的 URI302 Found
临时性重定向,请求的资源已被分配了新的 URI,不会更新书签303 See Other
临时性重定向,且总是使⽤ GET 请求新的 URI304 Not Modified
⾃从上次请求后,请求的⽹⻚未修改过(浏览器缓存机制)
4XX:客户端错误
400 Bad Request
服务器⽆法理解请求的格式,客户端不应当尝试再次使⽤相同的内容发起请求。401 Unauthorized
请求未授权。403 Forbidden
服务器已经得到请求,但是拒绝执行。404 Not Found
找不到如何与 URI 相匹配的资源
5XX: 服务器错误
500 Internal Server Error
最常⻅的服务器端错误。503 Service Unavailable
服务器端暂时⽆法处理请求(可能是过载或维护)