​python接口自动化(十)--post请求四种传送正文方式(详解)​

news2024/12/22 6:25:38

简介

  post请求我在之前的文章已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四种编码方式:

HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。

浏览器行为:Form表单提交

1、form表单常用属性

1 action:url 地址,服务器接收表单数据的地址
2 method:提交服务器的http方法,一般为post和get
3 name:最好好吃name属性的唯一性
4 enctype: 表单数据提交时使用的编码类型,默认使用"pplication/x-www-form-urlencoded",如果是使用POST请求,则请求头中的

enctype为form表单数据的编码格式,Content-type为Http传输的数据的编码格式。分清两者

如果你想学习接口自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386     

B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibiliB站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337

2、浏览器提交表单时,会执行如下步骤

1 识别出表单中表单元素的有效项,作为提交项
2 构建一个表单数据集
3 根据form表单中的enctype属性的值作为content-type对数据进行编码
4 根据form表单中的action属性和method属性向指定的地址发送数据

3、提交方式

1 get:表单数据会被encodeURIComponent后以参数的形式:name1=value1&name2=value2 附带在url?后面,再发送给服务器,并在url中显示出来。
2 post:enctype 默认"application/x-www-form-urlencoded"对表单数据进行编码,数据以键值对在http请求体重发送给服务器;如果enctype 属性为"multipart/form-data",则以消息的形式发送给服务器。

Http协议行为:Http1.1协议

我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

<method> <request-URL> <version> <headers> <entity-body>  

  协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主

体是用何种方式编码,再对主体进行解析。

所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分

常见的四种编码方式如下:  

1、application/x-www-form-urlencoded 

  这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1    
Content-Type:application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

  首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,

$_POST['title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。

  很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

2、multipart/form-data 

  除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

  这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值,下面是示例

form表单:

1 <form action="/upload" enctype="multipart/form-data" method="post">
2     Username: <input type="text" name="username">
3     Password: <input type="password" name="password">
4     File: <input type="file" name="file">
5     <input type="submit">
6 </form>

Http协议请求:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

  这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里

按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-

- 标示结束。关于 multipart/form-data 的详细定义,请前往 rfc1867 查看。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

  上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也只支持这两种方式(通过 <form> 元素的 enctype 属性指定,默认为 application/x-www-form-urlencoded。其实 enctype 还支

持 text/plain,不过用得非常少)。

  随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

3、application/json 

  application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持

JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

  JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-

www-form-urlencoded 方式提交。

  Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:

1 var data = {'title':'test', 'sub' : [1,2,3]};
2 $http.post(url, data).success(function(result) {
3     ...
4 });

最终发送的请求是:

1 POST http://www.example.com HTTP/1.1
2 Content-Type: application/json;charset=utf-8
3  
4 {"title":"test","sub":[1,2,3]}
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 
php://input
json_decode

  当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章。

4、text/xml 

  它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

 1 POST http://www.example.com HTTP/1.1
 2 Content-Type: text/xml
 3  
 4 <?xml version="1.0"?>
 5 <methodCall>
 6     <methodName>examples.getStateName</methodName>
 7     <params>
 8         <param>
 9             <value><i4>41</i4></value>
10         </param>
11     </params>
12 </methodCall>

  XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服

务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

  相比之下,get方式的数据提交方式(编码方式)只有一种,就是application/x-www-form-urlencoding

post请求四种传送正文方式:

  (1)请求正文是application/x-www-form-urlencoded

  (2)请求正文是multipart/form-data

  (3)请求正文是raw

  (4)请求正文是binary

(1)请求正文是application/x-www-form-urlencoded

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/x-www-form-urlencoded'})

  Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。

(2)请求正文是multipart/form-data

  除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})

发送文件中的数据需要(安装requests_toolbelt)

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(
    fields={'field0': 'value', 'field1': 'value',
            'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
    )

r = requests.post('http://httpbin.org/post', data=m,
                  headers={'Content-Type': m.content_type})

不需要文件

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})

r = requests.post('http://httpbin.org/post', data=m,
                  headers={'Content-Type': m.content_type})

(3)请求正文是raw

形式:

♦传入xml格式文本 
1 requests.post(url='',data='<?xml  ?>',headers={'Content-Type':'text/xml'})
♦传入json格式文本
1 requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})

 或者:

1  requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})

可以将一json串传给requests.post()的data参数,

(4)请求正文是binary

形式: 

1 requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})

 Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可。

输入:

url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print r.text

输出:

{ 
“args”: {}, 
“data”: “”, 
“files”: { 
“file”: “Hello world!” 
}, 
“form”: {}, 
“headers”: {…… 
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”, 
…… 
}, 
“json”: null, 
…… 
}

  文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。注意:一定要注意headers的类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot处理全局异常详解(全面详细+Gitee源码)

前言&#xff1a;在日常的开发工作中&#xff0c;项目在运行过程中多多少少是避免不了报错的&#xff0c;对于报错信息肯定不可以把全部信息都抛给客户端去显示&#xff0c;这里就需要我们对常见的七种异常情况统一进行处理&#xff0c;让整个项目更加优雅。 目录 一、基本介绍…

AMEYA360:航顺芯片产品有哪些 航顺家族介绍

经济型 HK32M050 家族 采用ARM Cotex-M0内核&#xff0c;最新工艺标准&#xff0c;最高48M主频&#xff0c;内置16K FALSH&#xff0c;4K SRAM&#xff0c;支持DMA&#xff0c;内置4个模拟比较器&#xff0c;2路运放&#xff08;PGA&#xff09;&#xff0c;支持多种通讯包括2个…

二叉树 — 给定二叉树中某个节点,返回该节点的后继节点

后继节点定义&#xff1a; 二叉树以中序的方式进行遍历打印&#xff0c;节点X的下一个节点&#xff0c;就是X的后继节点。 假设二叉树如下图所示&#xff1a;则中序遍历的后打印出来的就是 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7。如果X 3&#xff0c;则X的后继节…

Docker网络模型以及容器网络初探(一)

〇、前言 安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;默认bridge网桥&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host。各个方式有各自的特点&#xff0c;它们有着特定的差距&#xff0c;比如网络性能等&#xff0c;一般按照实际应用方式手动…

大数据之数据采集项目总结——hadoop,hive,openresty,frcp,nginx,flume

1、前期准备 2、数据收集 1、开启openresty&#xff0c;nginx和frcp内网穿透 2、编辑并启动定时器 3、查看是否收集到了数据 数据收集阶段结束&#xff0c;进入下一个阶段 2、将收集到的切分好的数据上传到hdfs 使用的工具&#xff1a;flume flume像一个管道一样&#xff0c…

三十九、动态规划——线性DP问题-例题题解

线性DP问题的例题状态划分 一、问题&#xff1a;数字三角形1、题目内容2、状态划分1&#xff09;状态编号 f[i][j]2&#xff09;状态划分 3、题解 二、最长上升子序列1、题目内容2、状态划分1&#xff09;状态编号 f[i]2&#xff09;状态划分 3、题解 三、最长公共子序列1、题目…

【二维偏序+双指针】ABC245 E

E - Wrapping Chocolate (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 因为两个数组都是无序的&#xff0c;因此可以考虑给这两个数组都排个序 将物品和盒子都按照两个维度去排序 我们可以先去枚举物品&#xff0c;然后去选对应的盒子 在选盒子的过程中&#xff0c;注…

【王道·操作系统】第四章 文件管理(下)

一、文件系统 1.1 文件系统的层次结构 用户需要通过操作系统提供的接口发出上述请求——用户接口由于用户提供的是文件的存放路径&#xff0c;因此需要操作系统一层一层地查找目录&#xff0c;找到对应的目录项——文件目录系统不同的用户对文件有不同的操作权限&#xff0c;因…

c++读取字符串字符时出错

这是我做的一个c爬虫程序但是在抓取网页的时候string类型传递出现了问题 以下是图片代码 url的值是 "http://desk.zol.com.cn/" 我不知道为什么数据传递会出问题 请大佬指教

Java 串口通信(RS232/485)

Java 串口通信&#xff08;RS232/485&#xff09; 一.串口通信页面二.串口服务实现1.Java 串口通信配置1.扩展包和依赖库2.Pom配置 2.启动类3.工具包类1.Common2.Crc16Modbus3.SerialUtil 4.WebSocket 配置1.启动配置2.监听配置 5.UI交互类1.串口配置对象2.串口信息获取接口3.R…

HOT39-对称二叉树

leetcode原题链接&#xff1a;对称二叉树 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&a…

JVM03-优化垃圾回收

JVM的内存区域中&#xff0c;程序计数器、虚拟机栈和本地方法栈这3个区域是线程私有的&#xff0c;随着线程的创建而创建&#xff0c;销毁而销毁&#xff1b;栈中的栈帧随着方法的进入和退出进行入栈和出栈操作&#xff0c;每个栈帧中分配多少内存基本是在类结构确定下来的时候…

消息中间件面试题详解

RabbitMQ 如何保证消息不丢失 消息的重复消费问题如何解决 rabbitmq中死信交换机&#xff08;RabbitMQ延迟队列有了解吗&#xff09; 延迟队列&#xff1a;进入队列的消息会被延迟消费的队列 场景&#xff1a;超时订单&#xff0c;限时优惠&#xff0c;定时发布 延迟队列 …

【Linux】-第一个小程序(进度条)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作…

Activiti modoler 整合后报错 TypeError: Cannot read property ‘namespace‘ of undefined

之前在Demo整合过没问题&#xff0c;结果好不容易整合到现在的项目&#xff0c;结果出现成这个鬼样子……问题找了好久&#xff0c;一直以为是SpringSecurity请求限制没放开&#xff0c;所以找SpringSecurity的debug日志&#xff0c;浏览器请求有没有404、500、502等&#xff0…

将OpenAI和ChatGPT模型与LearnDash线上学习平台结合使用

人工智能革命来了&#xff01;&#xff08;以尽可能最好的方式。&#xff09;了解如何使用 Uncanny Automator 通过 OpenAI 和 ChatGPT 模型为您的线上学习和LearnDash LMS提供动力。 当人们听到“人工智能”这个词时&#xff0c;他们往往会想到流氓机器人、无政府状态的机器人…

科技项目验收测试报告包括哪些内容?

科技项目验收测试报告是评估科技项目质量和可靠性的重要文件。通过全面的测试和评估&#xff0c;可以确保项目的质量&#xff0c;提高用户满意度&#xff0c;降低项目风险。 一、科技项目验收测试报告的内容 1. 项目概述&#xff1a;介绍项目的背景、目标和范围&#xff0c;…

从 AI 增强到大模型,企业使用数据的方式又将如何变化?

AI&#xff08;Artificial Intelligence&#xff0c;人工智能&#xff09;的发展不过百年&#xff0c;却已经深刻影响着人们的思维和见解&#xff0c;并逐渐关联到每个人生活和工作的方方面面。从最初的规则引擎和引入统计学方法&#xff0c;到基于知识表示和推理机制的专家系统…

瓴羊QuickBI数据门户帮助企业高效管理和展示数据,使其更加明确易懂

随着信息技术时代的到来&#xff0c;越来越多的企业意识到商业信息是其最宝贵的资产之一。对于获取商业信息&#xff0c;需要专业的数据分析。因此&#xff0c;商业智能BI工具&#xff0c;如瓴羊QuickBI已经成为企业信息化中必不可少的工具。它拥有卓越的数据管理和展示功能&am…

VS2019中WebService实现发布、调用以及问题汇总

VS2019中WebService实现发布、调用以及问题汇总 前言一、WebService是什么&#xff0c;意义有哪些&#xff1f;二、创建二.发布三.访问问题总结1.不是专用连接2.HTTP错误 403.14 - Forbidden3.HTTP 错误 404.3 - Not Found4.应用程序种服务器错误 前言 在对接工厂Mes的过程中&…