接口基础知识6:详解http request body(一篇讲明白常见请求体)

课程大纲

0课程大纲.png

一、定义

HTTP请求体(HTTP Request body):HTTP请求消息的可选部分,仅在请求方法支持且需要发送数据时使用。

POST方法、PUT方法有请求体,GET和HEAD方法没有请求体。

请求头和请求体之间会有一个空行,告诉服务器请求头部到此为止。

请求体中包含的实际数据类型和格式取决于请求头中的 Content-Type字段,所以每一种格式的请求体必须设置对应的请求头Content-Type字段。

请求头&请求体的区别

请求头 指定接口公共的部分(无论什么接口都要设置的项)。
请求体 指定接口定义的数据、变量,会因接口不同而不同。

请求头&请求体的联系

请求头和特定格式的请求体组合,发送服务器所需的数据。

二、7种常见请求体类型

postman请求体格式选择区

请求格式详解如下:

2.1 (默认)url编码表单

默认的请求类型,最常见最基础的请求体类型,通常用于HTML表单提交。

1、使用场景:

只能上传键值对。

2、使用方式:

请求头 Content-Type: application/x-www-form-urlencoded
(不设置请求头Content-Type,默认为此)
请求体 key1=value1&key2=value2

参数名和参数值使用“=”拼接,键值对以“&”符号分隔,且键和值都为URL编码(encodeURL()方法)。
注意 1、get请求会将参数拼接到url上发送(明文);

2、post请求会将参数放到body中发送(明文)。

3、举例:

① 发送一个get请求,填写参数name、psw,可见最终参数拼到url上发送至服务器。拼接后如下:

http://httpbin.org/get?name=tuxiaomao&psw=123456
1url编码_get请求1.png
1url编码_get请求2.png
1url编码_get请求3.png

实际发送的是经过url编码的,如下:
http%3A%2F%2Fhttpbin.org%2Fget%3Fname%3Dtuxiaomao%26psw%3D123456


1url编码_get请求4.png



② 使用post方法发送请求,填写参数name、psw,参数会放到请求体中单独发送,不拼接到url上。如下图:

1url编码_post请求1.png

1url编码_post请求2.png


2.2 (常用)form-data表单

也可以叫form表单,是一种常用的HTTP请求数据格式,用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。

2.2.1 边界boundary

它的边界(boundary)是一个由一串随机字符组成的字符串,用于分隔不同的表单字段和文件数据。(不需要手动添加,浏览器或接口测试工具会自动生成)

边界字符串在请求头中通过Content-Type字段的boundary参数指定,例如:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

边界字符串的作用是将请求数据划分为多个部分,每个部分包含一个表单字段或一个文件数据。在请求体中,每个部分以边界字符串开始,并以两个连续的换行符(\r\n)作为结束标志。每个部分的开头会包含一些额外的信息,如Content-Disposition字段用于指定数据的类型(表单字段或文件)和名称。

multipart/form-data的边界字符串需要保证在请求体中唯一且不会与实际数据冲突,通常使用随机生成的字符串来确保唯一性。边界字符串的长度一般为10个字符以上,以避免与实际数据中可能出现的字符串冲突。

1、使用场景:

可以上传文件,也可以上传键值对。可以二者同时上传,无数量限制。

常用于上传文件或二进制数据的场景,例如用户提交带有文件附件的表单、图片上传等。

2、使用方式:

请求头 Content-Type: multipart/form-data
请求体 会将请求体以标签为单元,用分隔符boundary分隔开,每部分包含一个不同的表单域(即字段)数据。

每一部分,使用content-type表明文件类型;content-disposition说明字段的一些信息。

3、举例:

① post请求使用form-data表单提交键值对。

请求头设置如下,

2form表单_提交键值对1.png
2form表单_提交键值对2.png

只有1个键值对时,可见首尾的boundary分隔符(是一个字符串),如下,

2form表单_提交键值对3.png

有多个键值对时,可见每个键值对首尾的boundary分隔符(是一个字符串),参数之间以一个boundary分隔。如下,

2form表单_提交键值对4.png



② post请求使用form-data提交键值对和文件

如下图,可见表单数据是2部分,一部分是desc字段,内容是省略号部分;另一部分是上传的图片文件,内容是“[图片二进制数据]”(这里是省略了二进制数据,用描述代替了)。


2form表单_提交键值对和文件.png

2.3(很少用)binary二进制数据

用于传输二进制数据或文件内容,请求体中的数据是原始的字节。

1、使用场景:

只可以上传二进制数据(流或者字节数组),通常用来上传文件,一次只能上传一个文件。(数据被当作一系列字节处理)

(土小帽使用图搜引擎尝试,发现是使用form-data上传图片,足见二进制方式很少用。)

2、使用方式:

请求头 Content-Type: 上传文件的类型(如 image/jpeg)
请求体 文件转为流或字节数组进行传输,Content-Type: multipart/octet-stream会包含在请求体数据中。

3、举例:

使用postman上传一张图片到httpbin.org(接口测试网站,会返回发送的请求),如下图。

3binary二进制数据_提交一个文件1.png
3binary二进制数据_提交一个文件2.png

2.4 (最常用)json字符串

用于发送JSON编码的数据。

json是一种开放标准的文件格式和数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。现代Web APIs和RESTful服务通常用这种格式。

1、使用场景:

目前大部分接口都是用json传输数据。

2、使用方式:

请求头 Content-Type: application/json; charset=UTF-8

(“; charset=UTF-8”可不写)
请求体 JSON字符串,如:

{ "key1": "value1", "key2": "value2" }

3、举例:

发送1个post请求到httpbin.org(接口测试网站,会返回发送的请求),如下图。


4json_请求格式1.png
4json_请求格式2.png

2.5 纯文本格式:text/plain(见上表)

2.6 html网页格式:text/html(见上表)

text/plain和text/html的区别

写一个简易server,分别设置返回头Content-Type为2种格式,看浏览器对返回字符串的显示方式区别。

from http.server import HTTPServer, BaseHTTPRequestHandler


class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        # self.send_header('Content-Type', 'text/plain')
        self.send_header('Content-Type', 'text/html')
        self.end_headers()
        response = r'<html><head></head><body><div style="color: blue; font-size: 16px;">tuxiaomao</div></body></html>'
        self.wfile.write(bytes(response, 'utf-8'))


if __name__ == '__main__':
    httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
    print("Serving at http://localhost:8000")
    httpd.serve_forever()
text/plain(纯文本格式) html标签被浏览器识别为纯文本并显示。
5plain和html区别1.png
5plain和html区别2.png
text/html(html网页格式) html标签被浏览器解析,最终显示标签包围的指定格式的文本“tuxiaomao”。
5plain和html区别3.png
5plain和html区别4.png


2.7(极少)xml可扩展标记语言格式

比较老的格式,现在基本不用了。有兴趣可以查看以下文章了解:

《MIME类型中application/xml与text/xml的区别介绍》



参考文章:
1、《Multipart/form-data POST文件上传详解》https://blog.51cto.com/u_15930680/5991162

2、《multipart/form-data的边界是什么?》
https://cloud.tencent.com/developer/information/multipart%2Fform-data%E7%9A%84%E8%BE%B9%E7%95%8C%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-salon

3、《application/x-www-form-urlencoded与multipart/form-data与application/json的区别 精析》
https://blog.51cto.com/u_15964717/6058599

4、《form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式》
https://www.cnblogs.com/yeminglong/p/13152192.html

5、《发送form-data数据时,boundary是浏览器自动设置的吗?》
https://segmentfault.com/q/1010000044886344

6、《Multipart/form-data POST文件上传详解》
https://blog.51cto.com/u_15930680/5991162

7、《请求头Content-Type》
https://www.jianshu.com/p/46fec81809df

8、《【小白学爬虫】text/plain》
https://www.jianshu.com/p/7caacd0800f4

9、《HTTP请求格式详解》
https://www.bilibili.com/read/cv33757460/?jump_opus=1

10、《HTTP协议(请求和响应)》
https://www.kancloud.cn/stone8034/java/1675120

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