HTTP知识总结

前言

日常使用,经常使用HTTP协议,今天简单总结下。

HTTP报文样例

以下是一个HTTP报文样例

GET /api/random HTTP/1.1
Host: 127.0.0.1:5000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
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: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: jenkins-timestamper-offset=-28800000; jenkins-timestamper=system; jenkins-timestamper-local=true

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 25
Access-Control-Allow-Origin: *
Server: Werkzeug/0.15.5 Python/3.7.3
Date: Wed, 04 Sep 2019 14:18:08 GMT

{
  "randomNumber": 40
}

HTTP 请求报文结构

HTTP 请求报文结构
  • 请求行 -- 包含用于请求的方法、请求 URI 和 HTTP 版本。
    如上面例子
GET /api/random HTTP/1.1
  • 请求头 -- 这里通常就是我们说的Headers,包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)

格式为:

头部字段名 + 冒号(:) + 值 + 回车符 + 换行符

如上面例子

Host: 127.0.0.1:5000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
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: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: jenkins-timestamper-offset=-28800000; jenkins-timestamper=system; jenkins-timestamper-local=true
  • 空一行 -- 表示请求头部结束,这一行必不可少。
  • 请求正文 -- 这里通常就是我们说的Body一般使用在 POST 方法中, GET 方法一般不存在请求正文。
    如上面例子,body没有数据

HTTP 响应报文结构

HTTP 响应报文结构
  • 状态行 -- 包含表明响应结果的HTTP 版本、状态码和状态码描述 。
    如上面例子,其中200 是状态码
HTTP/1.0 200 OK
  • 响应头 -- 这里通常就是我们说的Headers,包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)

格式为:

头部字段名 + 冒号(:) + 值 + 回车符 + 换行符

如上面例子

Content-Type: application/json
Content-Length: 25
Access-Control-Allow-Origin: *
Server: Werkzeug/0.15.5 Python/3.7.3
Date: Wed, 04 Sep 2019 14:18:08 GMT
  • 空一行 -- 表示响应头部结束,这一行必不可少。
  • 响应正文 -- 这里通常就是我们说的Body

如上面例子,body有数据

{
  "randomNumber": 40
}

HTTP 常用响应状态码

  • 200 = 响应成功
  • 301 = 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302 = (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 400 = (错误请求) 服务器不理解请求的语法。
  • 403 = (禁止) 服务器拒绝请求。
  • 404 = (未找到) 服务器找不到请求的网页。
  • 500 = (服务器内部错误) 服务器遇到错误,无法完成请求。

Python请求HTTP接口样例

这里以GETPOST请求方法method为例

  • GET 请求-无参数
import requests

r = requests.get('http://127.0.0.1:5000/api/random')
  • GET 请求-有参数
import requests

params = {'key1': 'value1', 'key2': 'value2'}

r = requests.get('http://127.0.0.1:5000/api/random', params=params)
  • POST请求-没有请求参数params,没有请求body
import requests

r = requests.post('http://127.0.0.1:5000/api/random')
  • POST请求-有请求参数params
import requests

params = {'key1': 'value1', 'key2': 'value2'}

r = requests.post('http://127.0.0.1:5000/api/random', params=params)
  • POST请求-有请求参数params,有请求body,但非json格式。

如请求body为key3=value3&key4=value4

import requests

params = {'key1': 'value1', 'key2': 'value2'}
body = {'key3': 'value3', 'key4': 'value4'}

r = requests.post('http://127.0.0.1:5000/api/random', params=params, data=body)
  • POST请求-有请求参数params,有请求body为json格式

如请求body为{"key3": "value3", "key4": "value4"}

import requests

params = {'key1': 'value1', 'key2': 'value2'}
body = {'key3': 'value3', 'key4': 'value4'}

r = requests.post('http://127.0.0.1:5000/api/random', params=params, data=json.dumps(body))

或者

import requests

params = {'key1': 'value1', 'key2': 'value2'}
body = {'key3': 'value3', 'key4': 'value4'}

r = requests.post('http://127.0.0.1:5000/api/random', params=params, json=body)

分块传输CHUNKED编码

分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供,表示Body里的数据将用chunked编码传输内容。

Transfer-Encoding: chunked

根据定义,浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面。并且可以下载html中定义的页面内容,包括js,css,image等。

    1. 每个分块的格式都是一致的:
length<CR><LF>
data<CR><LF>

length是十六进制的数据长度.

    1. 最后一个分块比较特殊,他是一个0长度的分块,表示数据结束.这时候接收端就认为这次的数据已经读取完成了.

如下面例子:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1A
and this is the second one
0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 本文的主要内容 HTTP 是什么 URL 详解 HTTP 之请求篇 HTTP 之响应篇 1. HTTP是什么 1....
    cbw100阅读 766评论 1 6
  • HTTP 图解笔记 一 .简单了解 1.1HTTP背景 1.1.1 HTTP的诞生 1989 年 3 月,互联网还...
    Aaron96阅读 1,039评论 0 4
  • HTTP 首部 HTTP 报文首部 HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客 户端和...
    Gu_Ran阅读 752评论 0 3
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,861评论 0 3
  • 心爱的老公回来了 今天我依旧在上班,为什么回来呢?是因为他爸爸做几天要开刀,所以把他叫回来了,我让他找他爸...
    岁月蹉跎努力阅读 185评论 0 0