HTTP协议

http报文结构:

 

 请求报文以及响应报文结构

 

 一:http请求报文的结构:

 

http请求报文详细内容:

HTTP 请求报文分为3部分:第一部分叫起始行,第二部分叫首部,第三部分叫主体。

第一行中的Method表示请求方法,比如"POST"或者"GET",现在使用的HTTP协议版本是HTTP/1.1。

第二部分是首部(Header)。

第三部分是主体(Body)。

 二:HTTP响应报文结构:

HTTP响应报文的详细内容:

 Response消息的结构和Request消息的结构基本一样,同样也分为3部分:第一部分叫响应行(Response Line),第二部分叫响应首部(Response Header),第三部分是主体(Body)

第一部分是起始行,有状态码和状态消息,后面会详细介绍。

第二部分是首部(Header),后面会详细介绍这些首部的用法。

第三部分是主体(Body),如果是GET方法,就没有主体。

 

二:HTTP请求方法:

1:GET方法:

get是最常见的方法,用于获取资源,常用于向服务器查询某些信息。

1.1  带参数的GET方法

浏览器也可以在GET方法中把数据传输给服务器,数据放在URL的问号(?)后面。

将查询字符串参数追加到URL末尾,以便将信息发送给服务器。这种方式叫查询字符串,或者叫Query String.

例如:如下GET请求

GET /sugrec?prod=pc_his&from=pc_web&json=1&sid=30744_1466_21120_30792_30823_26350_22159&hisdata=%5B%7B%22time%22%3A1582096025%2C%22kw%22%3A%22android%20hook%E6%8A%80%E6%9C%AF%22%7D%2C%7B%22time%22%3A1582097219%2C%22kw%22%3A%22android%20%E9%80%86%E5%90%91%20hook%E6%8A%80%E6%9C%AF%22%7D%2C%7B%22time%22%3A1582097625%2C%22kw%22%3A%22xposed%20installer%22%7D%2C%7B%22time%22%3A1582097642%2C%22kw%22%3A%22xposedinstaller%E6%80%8E%E4%B9%88%E7%94%A8%22%7D%5D&req=2&csor=0 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BAIDUID=B505B103FFD1468EC4BCFE74485D62AC:FG=1; BIDUPSID=B505B103FFD1468EC4BCFE74485D62AC; PSTM=1582095928; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDUSS=RiUkhMQlFXOTBYbWdYYmJhNlZ-LUY1ZFRlU2YxSzVGTnFhaXBtblcwb1FkblJlRVFBQUFBJCQAAAAAAAAAAAEAAAADf6tBu-HJy8Tj0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDpTF4Q6Uxec2; ai-studio-ticket=43F275A5E84148A3AAED77BEBDA91762D6122A22293048AEA219AAE637FACFE8; yjs_js_security_passport=a91f3791eede0aa7cf4deb7fbaf43fc7adcc52ee_1582271746_js; H_PS_PSSID=30744_1466_21120_30792_30823_26350_22159; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; BD_CK_SAM=1; PSINO=7; BD_HOME=1; sugstore=1

对应的Query String如下:

 查询字符串以"名=值" 这样的形式出现,多个名值之间用字符"&"隔开。

 

2:POST方法:

POST方法通常用来把表单中填好的数据发送给服务器。

 我们可以清晰地看到浏览器发出的是POST方法,该方法把用户名和密码的信息发送给了服务器。

如下所示 POST 的内容:

POST /mp/getappmsgext?f=json&mock=&uin=ODQyMTk3ODI1&key=7d42e6f9dbc0e89174a371952c04fe1e41f2a4ba043fdf450cef3800c7c0b616062c91abeffe1eeafe9dd9457b99af6687781aa51b7b976ef1203321b68e51daedf83c6297d0cca25443d3b3b40761d1&pass_ticket=7ov6jB3KY7EpTvhNRc7MPSCfR4QxxWEN82%25252FDBa2%25252BQ1A4RC1GntFBxywcjQNAPop6&wxtoken=777&devicetype=Windows%26nbsp%3B10&clientversion=620603c8&__biz=MzU2MDQ5NDQ3OQ%3D%3D&appmsg_token=1049_mweIwuQTLM6lXB%252F9aVbDW-qdDf1HoE4gNdsUNq3jLVRPzapemCXT8GJsXZN3pWsren3AjXmrzPicpbHR&x5=0&f=json HTTP/1.1
Host: mp.weixin.qq.com
Connection: keep-alive
Content-Length: 959
Accept: */*
CSP: active
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: https://mp.weixin.qq.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.884.400 QQBrowser/9.0.2524.400
X-Requested-With: XMLHttpRequest
Referer: https://mp.weixin.qq.com/s?__biz=MzU2MDQ5NDQ3OQ==&mid=2247493436&idx=1&sn=a9d115e08ecb1f67a3cac23a5398cd6a&chksm=fc0585dccb720cca1e5933c7f41512355614012c4678c7b0d18fbf9a7c2f55aa3f3ae34bfbc4&scene=0&xtrack=1&key=7d42e6f9dbc0e89174a371952c04fe1e41f2a4ba043fdf450cef3800c7c0b616062c91abeffe1eeafe9dd9457b99af6687781aa51b7b976ef1203321b68e51daedf83c6297d0cca25443d3b3b40761d1&ascene=1&uin=ODQyMTk3ODI1&devicetype=Windows+10&version=620603c8&lang=zh_CN&exportkey=A%2FCyU0FTTWTkzNIrRouw0dk%3D&pass_ticket=7ov6jB3KY7EpTvhNRc7MPSCfR4QxxWEN82%2FDBa2%2BQ1A4RC1GntFBxywcjQNAPop6&winzoom=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-us;q=0.6,en;q=0.5;q=0.4
Cookie: rewardsn=; wxtokenkey=777; wxuin=842197825; devicetype=Windows10; version=620603c8; lang=zh_CN; pass_ticket=7ov6jB3KY7EpTvhNRc7MPSCfR4QxxWEN82/DBa2+Q1A4RC1GntFBxywcjQNAPop6; wap_sid2=CMHWy5EDEnA4bUFkZFBKY05rU05lY0F4ZkF0SmE1Ym9XT2FFclhtRFZGQVNmMGhkWllDNlE5dEZWamV5Vy1NZjJMaGFRV0VpTVp6ZzliMUl6YXdjbmpUZldxb0o4eFpwNUlTTTNjZGREM1ZNcWV6TTRmb1pCQUFBMLSJv/IFOA1AAQ==

r=0.8014043022412807&__biz=MzU2MDQ5NDQ3OQ%3D%3D&appmsg_type=9&mid=2247493436&sn=a9d115e08ecb1f67a3cac23a5398cd6a&idx=1&scene=0&title=121%25E5%2590%258D%25E6%2596%25B0%25E5%2586%25A0%25E8%2582%25BA%25E7%2582%258E%25E7%25A1%25AE%25E8%25AF%258A%25E6%2582%25A3%25E8%2580%2585%25E5%259C%25A8%25E9%259A%258F%25E5%25B7%259E%25E5%25B8%2582%25E4%25B8%25AD%25E5%25BF%2583%25E5%258C%25BB%25E9%2599%25A2%25E6%25B2%25BB%25E6%2584%2588%25E5%2587%25BA%25E9%2599%25A2&ct=1582284852&abtest_cookie=&devicetype=Windows%2010&version=620603c8&is_need_ticket=0&is_need_ad=0&comment_id=0&is_need_reward=0&both_ad=0&reward_uin_count=0&send_time=&msg_daily_idx=1&is_original=0&is_only_read=1&req_id=2119fS0vBjZfC24qrE3uYqdf&pass_ticket=7ov6jB3KY7EpTvhNRc7MPSCfR4QxxWEN82%25252FDBa2%25252BQ1A4RC1GntFBxywcjQNAPop6&is_temp_url=0&item_show_type=0&tmp_version=1&more_read_type=0&appmsg_like_type=2&related_video_sn=&vid=&is_pay_subscribe=0&pay_subscribe_uin_count=0&has_red_packet_cover=0

 对应的FROM表单

3:GET和POST的区别 

1:GET和POST的数据会放在URL之后,以问号(?)分割URL和传输数据,参数之间&相连,如 /sugrec?prod=pc_his&from=pc_web&json=1&sid=30744_1466_21120_30792_30823_26350_22159。POST方法是把提交的数据放在HTTP包的Body中。

2:GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据大小没有限制。

3:  GET方式需要使用Request.QueryString来取得变量的值,而POST方法通过Request.From来获取变量的值。

4: GET方式提交数据会带来安全问题,比如一个登陆页面通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

三: HTTP Header介绍

  • Accept    表示浏览器客户端可以接受的媒体类型

    例如,Accept:text/html 代表浏览器可以接受服务器返回html,也就是我们通常说的html文档。

 

  • Accept-Encoding    跟压缩有关,浏览器发送HTTP请求给web服务器,HTTP请求中的Header有Accept-Encoding;gizp,deflate(告诉服务器,浏览器支持gzip压缩)。

 

  • Accept-Language

        Accept-Language 的作用是浏览器声明自己接受的语言。

        语言跟字符集的区别在于: 中文是语言,中文有多种字符集,比如big5,gb2313,gbk等。示例如下:

         Accept-Language: en-US,en; q=0.8,zh-CN; q=0.6,zh; q=0.4,zh-TW; q=0.2

 

  • User-Agent

         User-Agent的作用是浏览器告诉服务器,客户端使用的操作系统及版本,CPU类型,浏览器及版本,浏览器渲染引擎,浏览器语言,浏览器插件等。

 

  • Connection

         从HTTP/1.1起,系统默认都开启了Connection:Keep-Alive,保持连接特性。

         HTTP协议是基于TCP协议的。当一个网页完全打开后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭;如果客户端再次访问这个服务器上的网页,将会继续使用这条已建立的连接。

         Keep-Alive 不会永久保存连接,它有一个保存时间,可以在不同的服务器软件(如Apache)中设定这个时间。

 

  • Host

        Host 这个Header 是必须的,它的作用是指定被请求的主机和端口号,它通常从HTTP URL中提取出来。

        实例: 我们在浏览器中输入 https://www.cnblogs.com/tankxiao/,浏览器发送的 HTTP请求中就会包含Host的Header,例如 Host: www.cnblogs.com。此处使用了默认端口80.

        如果指定了端口,例如我们在浏览器中输入 http://tankapi.vicp.io:15375/,则Header变为Host: tankapi.vicp.io:15375。

http post文件上传机制 

下面是提交的经度,维度和一张图片(图片数据比较长,而且比较杂乱,这里省略了)。

POST /api/feed/ HTTP/1.1  
Accept-Encoding: gzip  
Content-Length: 225873  
Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Host: www.myhost.com  
Connection: Keep-Alive  
  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="lng"  
Content-Type: text/plain; charset=UTF-8  
Content-Transfer-Encoding: 8bit  
  
116.361545  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="lat"  
Content-Type: text/plain; charset=UTF-8  
Content-Transfer-Encoding: 8bit  
  
39.979006  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="images"; filename="/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg"  
Content-Type: application/octet-stream  
Content-Transfer-Encoding: binary  
  
这里是图片的二进制数据  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--  

格式分析:

先看报文格式中的第一行:

POST /api/feed/ HTTP/1.1  

这一行说明了这个请求的请求方式,即为POST方式,需要请求的子路径为 /api/feed/, 例如我们服务器地址为www.myhost.com,然后我们的这个请求的完整路径就是www.myhost.com/api/feed/,最后说明了HTTP协议的版本号为1.1。

Accept-Encoding: gzip  
Content-Length: 225873  
Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Host: www.myhost.com  
Connection: Keep-Alive

其中这里需要注意的一点是分隔符,即boundary。boundary用于作为请求参数之间的界限标识,例如参数1和参数2之间需要有一个明确的界限,这样服务器才能正确的解析到参数1和参数2。但是分隔符并不仅仅是boundary,而是下面这样的格式:-- + boundary。例如这里的boundary为OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp,那么参数分隔符则为:

OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp 

在讲解报文前先理解multipart/form-data

multipart/form-data也是在post基础上演变而来的,具体如下:

1.multipart/form-data的基础方式是post,也就是说通过post组合方式来实现的。

2.multipart/form-data于post方法的不同之处在于请求头和请求体。

3.multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,其值也必须为multipart/form-data,同时还需要规定一个内容分割用于分割请求提中多个post的内容,如文件内容和文本内容是需要分隔开来的,不然接收方就无法解析和还原这个文件了,具体的头信息如下:

Content-Type: multipart/form-data; boundary=${bound}  

其中${bound} 是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365

multipart/form-data格式发送的请求,它包含了多个Parts,每个Part都包含头信息部分。

Part头部信息中必须包含一个Conent-Disposition头,其他头信息则为可选项,比如Content-Type等。

Content-Disposition 包含了 type 和 一个名字为 name 的 parameter,type 是 form-data,name 参数的值则为表单控件(也即 field)的名字,如果是文件,那么还有一个 filename 参数,值就是文件名。

比如:

Content-Disposition: form-data; name="user"; filename="hello.txt"

上面的"user" 就是表单中的控件的名字,后面的参数filename则是点选的文件名。

对于可选的Content-Type(如果没有的话),默认就是text/plain。

 

下面为报文主体:

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="lng"  
Content-Type: text/plain; charset=UTF-8  
Content-Transfer-Encoding: 8bit  
  
116.361545  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="lat"  
Content-Type: text/plain; charset=UTF-8  
Content-Transfer-Encoding: 8bit  
  
39.979006  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp  
Content-Disposition: form-data; name="images"; filename="/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg"  
Content-Type: application/octet-stream  
Content-Transfer-Encoding: binary  
  
这里是图片的二进制数据  
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--  

 1:上面的 --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp 也就是--加上boundary内容,最后加上一个换行 (这个换行不能省略),换行的字符串表示为"\r\n"。

2: Content-Disposition和参数名,这里的参数名为lng和lat,即经度和维度。

3: Content-Type,即WEB 服务器告诉浏览器自己响应的对象的类型,还有指定字符编码为UTF-8。

4:两个换行之后才是参数的具体内容。 比如这里的116.361545和39.979006

5:对于文件比如Content-Disposition: form-data; name="images"; filename="/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg"  ,images是表单控件,/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg是文件名称

 

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值