HTTP协议与TCP/IP协议族内的众多协议相同,用于客户端与服务端通信的协议。
HTTP是一种不保存状态的协议,即无状态的协议,对于发送过的请求和响应不保存,不进行持久化处理。
简单说下http请求与响应的组成。
http请求
//这里给个抓取的接口请求
GET /sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=1429,21122,18559,29523,29721,29568,29221&wd=h&req=2&bs=tcp&pbs=tcp&csor=1&pwd=tcp&cb=jQuery1102023459447476702122_1569330407362&_=1569330407401 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=tcp&oq=http&rsv_pq=fb2b40d8003d883d&rsv_t=0cc2OOqo%2BlNoq457a32mFhm5dNjRimeetk%2BRhCY4%2FVvBm0F5Un91acwulq8&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=36&rsv_sug1=34&rsv_sug7=101&rsv_sug2=0&inputT=12103&rsv_sug4=12757
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=C2C5A41BEE5E66F5722CDA5C467EEFB7; BAIDUID=3D909B04CAAC1473983084F92BF1F3C1:FG=1; PSTM=1560408602; BD_UPN=123253; delPer=0; BD_CK_SAM=1; BDSFRCVID=CTCsJeCCxG3jWp3w7yt0b8PQt5HRPm3zjy4T3J; H_BDCLCKID_SF=tJkf_CPMJIP3jRTph4vEqR0h5pr0etJyaR0fanvvWJ5TMCo6KR512-tWyxnDW4vHBevGa56RJnOxShPC-tnE0MDkyPOH-6QdyTvk5DLb3l02VhnIe-t2ynLVbn6xLtRMW23i0h7mWpTTsxA45J7cM4IseboJLfT-0bc4KKJxthF0hI09D6KMj6PShl8XhtvKa5R0WjrJabC3O-3sXU6qLT5XjmcUB43Hb2QLQ66S-qrnER51X6jZ5l0njxQy-JbUWmCJoUJaKlo1M4_R-xonDh8q3H7MJUntHmLjbl7O5hvvOn3O3M7zLUKmDloOW-TB5bbPLUQF5l8-sq0x05bke6jWjHtJt5-sKKoJstcSKR72jJuk-PnVeU4nLtnZKxtqtJnLLK3-Wt3ksIbqMb5FQUD8hM5xJJjnWncKWKDy0fbGJbbmKb5ILPA9hRn405OTXKFO0KJcb668ep7RhPJvyUPsXnO7BxJlXbrtXp7_2J0WStbKy4oTjxL1Db0eBjIHJnADVCK-tCvEHRjv5b__-P4DenQy0fRZ5mAqoto4btQaf43_QTO2MbDNQP5dQtch36rnaIQqa56RjbcDyJoaKb8I-fQ--lO43bRTaUKy5KJvfJodhfv6hP-UyPRMWh37Wm7lMKoaMp78jR093JO4y4Ldj4oxJp8eWJLD_KIMJI02bPb4-tbqq6QLMxnaetJyaR3DBx7bWJ5TEPnjDP6q3jtWKq5dy-4j-IOKBtIyB56Dstbd2qt5y6TyjaKetT-tf5vfL5rs2R52jJuk-PnVeP7X5hbZKxJmMgkeBfQhKt3aqx7ajt8KMn0yjx7MWt5EKGOPVIOFfDDbbDt4DT835tCthUIXKPoX5KnKWJ08Kb7VbpO2Lnbkbftd2-teaqbjt5kfX4-MKDnmVt-Gyh5mhjthMluJLTJZfD7H3KC-tC-bbM5; ZD_ENTRY=empty; BDRCVFR[feWj1Vr5u3D]=mk3SLVN4HKm; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=0; pgv_pvi=1400150016; pgv_si=s7003186176; PSINO=5; ispeed_lsm=2; H_PS_645EC=9c60Shb%2F%2B68A8Z1ThIKspXrqI%2FD3ZI3rG4OhTzE4jSYnS0a0qZokHFzMFtk; BDSVRTM=149; H_PS_PSSID=1429_29869_21122_18559_29523_29721_29568_29221; COOKIE_SESSION=12670_0_7_6_18_6_0_0_6_4_1_0_0_0_2_0_1569317916_0_1569330584%7C9%23828338_22_1568854639%7C3
http请求组成如下
请求方法+URI +协议版本
请求首部字段
请求内容实体
http响应组成如下
协议版本+状态码+状态原因短语
响应首部字段
<空行>
响应内容实体
//这里给个抓取的接口响应
HTTP/1.1 200 OK
Content-Length: 53
Content-Type: text/plain; charset=UTF-8
Date: Tue, 24 Sep 2019 13:10:59 GMT
Connection: keep-alive
jQuery1102023459447476702122_1569330407362({"q":"h"})
1:get
获取服务器的资源请求方法。
用来请求访问已被URI识别的资源,指定的资源经服务端解析后返回响应内容。
如果请求的资源是文本,那么原样返回;
如果请求的是CGI(通用网关接口),那么是返回执行后的输出结果。
2:post
将客户端的资源发送给服务端。
传输实体主体。
3:put
传输文件。就像ftp文件上传一样,在请求报文中包含主体内容,然后保存到请求URI指定的位置。
但是无验证机制,存在安全性问题。
4:delete
删除文件,发送请求,删除请求URI中指定的资源。
但是无验证机制,存在安全性问题。
5:head
获取请求头的方法。
与GET方法类似,但是响应无报文主体部分。
这个就是在确认URI有效性以及资源更新时间,或者其他需要看响应首部字段value的情况,比较适用。
6:options
获取支持的方法。
看请求的URI指定的资源支持的方法。
7:trace
追踪路径,让服务器将之前的通信请求返回给客户端的方法。
客户端可以通过这个看发出去的请求如何被加工/篡改。
使用的时候,需要在MAX-Forwards中加上次数,表示请求流转服务器的最大次数。
但是这个容易引起XSS攻击。
8:connect
在与代理服务器通信时简历隧道,实现用隧道协议进行TCP通信。
主要用SSL(安全套接层)和TLS(传输层安全)协议吧通信内容加密后经隧道传输。
connect 代理服务器名:端口号 http版本
1xx:进行中
表示接收的请求正在处理。
2xx:一切正常,请求正常处理完毕
200 OK:发送的请求在服务端正常处理完毕了。
204 no content:请求处理成功,但是无资源可返回。用于发送信息,服务端不需要更新的情况。
比如,用户在浏览器窗口导航返回content为空,则不变;但是如果这种场景状态码返回的是200OK,就会再刷新一次 。
206 partial content:正常处理范围请求
这是客户端进行了范围请求,而服务器正常执行这部分的GET请求。
比如说,下载了一半之后继续,一般会在请求头加上一些标识。
响应报文也在content-range中指定范围实体内容。
3xx 重定向
3xx表示浏览器需要执行某些特殊的处理已正确处理请求。
301:moved permanently,永久性重定向
请求的资源,已经分配了新的URI,以后使用改资源要用响应返回的URI。
302:found,临时性重定向
资源分配了新的URI,但是只是临时in 告知的,也不会向301一样取更新。
303:see other:请求对应的资源存在另一个URI,应使用get方法定向获取请求资源。
与301.302不同,303明确表示客户端要使用get方法获取资源。
虽然301、302、303返回时,浏览器都会把方法改成get,重新发送,但是301、302标准是禁止把post方法改成get的。
304 not modified:资源未更改,可以直接使用客户端未过期的缓存。
304返回时,不包含响应的主体部分,不会重定向,或者找不到满足条件的内容。
307:temporary redirect:临时重定向
与302相同,只是在这里允许将方法从post改成get.
303与307状态码是http1.1版本,对1.0版本中302的补充
4xx:客户端出错
400 bad request:请求存在语法问题
401:unauthorized:未认证。
请求需要通过http认证,如果之前已经有过一次请求,表示认证失败;如果没有,会弹出认证可进行认证。
403:forbidden:被拒绝
请求资源的访问被服务器拒绝了,可能是权限问题等。
404:not found:找不到对应的资源。也可以是服务端拒绝请求并不想说明。
5xx:服务端错误
500:internal server error
服务器在执行请求时出错。
503:service unavailable
服务器正处于超负载或者停机维护,无法处理。