python - Robotframework.request - 如何使用内容“multipart/form-data”发出 POST 请求
问题描述
我想使用RequestsLibrary在 Robot Framework 中使用“Content-Type:multipart/form-data”发出 POST 请求,但似乎没有任何效果。发出此请求的关键字如下所示:
*** Variables ***
&{API_CREDS} username=myusername password=mypwd
*** Keywords ***
Get token
# Assumes that session has been created
[Arguments] ${Session_id}
&{headers}= create dictionary Content-Type=multipart/form-data
${response}= Post Request ${Session_id} ${AUTH_TOKEN_URL_PATH} data=${API_CREDS} headers=${headers}
should be equal as integers ${response.status_code} 200
[Return] ${response.json()['token']}
但实际发送的 POST 请求不包含“Content-Type”标头,正文只是一个原始的data={'username' = 'myusername', ' password' = 'mypwd'}
我已经尝试了很多我发现的东西,但没有任何效果。Robot Framework是否RequestsLibrary
真的支持发送带有“Content-Type: multipart/form-data”的 POST 请求?,如果是,这是如何完成的?
PS:我Windows 10
在Python 3.7.1
. POST 请求实际上是发送的,但它不包含 Content-Type 标头,也不包含 form-data 有效负载,如上所述。
解决方案
使用的底层 python 库 -requests
具有处理多部分“表单数据”内容的一些特性。它主要使用它作为请求的一部分发送文件(上传功能);粗略地说,当它解析您的参数时,它会剥离标题,因为没有要发送的文件。此外,如果它没有这样做,它的设计目的不是为了扣除多部分有效负载中的不同部分——例如,它不会自动将每个键值对放在一个单独的部分中。
为了克服这一点,通常使用files
参数,将不同部分的内容作为参数传递。这样做时,requests
库将自动设置表单数据标题,并将内容分成几部分。
以下是如何在 RF 中执行此操作,解释如下:
${data}= Evaluate {'username': (None, 'myusername'), 'password': (None, 'mypwd')}
${response}= Post Request ${Session_id} ${AUTH_TOKEN_URL_PATH} files=${data}
使用关键字files
中的参数,Post Request
您的有效负载将按原样传递给requests
post 方法。您不需要明确设置标题,库会为您完成。
作为参数传递的是字典,值是部分的内容。如您所见,实际值是 python 元组,因为您想覆盖部件中的文件名。用一个例子可以更好地解释这一点;如果数据是这样的,那么值就是一个简单的刺痛:
${data}= Evaluate {'username': 'myusername', 'password': 'mypwd'}
,那么有效载荷将变为:
--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="username"; filename="username"
myusername
--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="password"; filename="password"
mypwd
--7579227dh785568ha91866339229add786--
请注意每个部分如何具有“文件名”属性,等于参数名称。
当值是一个元组时,它的第一个成员设置部分的“文件名”属性;当它是 a 时None
,根本没有“文件名”,产生这个结果:
--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="username"
myusername
--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="password"
mypwd
--7579227dh785568ha91866339229add786--
,这可能是你的目标。
推荐阅读
- java - 使用 getter 和 setter 问题将数据传递给回收器适配器
- python - 使用矩阵乘法 python 将 RGB 转换为 YIQ
- kubernetes - 将文件复制到本地/主机目录
- wordpress - 是否可以对用户进行身份验证以自动登录到 wp-admin usgin API auth?
- jenkins - 使用 github 更改触发管道作业
- android - 控制 UI 如果任何改造服务正在运行
- sorting - 检查数字是否按顺序排列
- java - 替换 Lambda 表达式 - Lambda 表达式 -> 应该替换,因为我的 Java 不支持
- c# - 我如何获取服务器名称和实例名称并在 app.config 中使用
- go - websocket 设置协议和来源