首页 > 解决方案 > 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 10Python 3.7.1. POST 请求实际上是发送的,但它不包含 Content-Type 标头,也不包含 form-data 有效负载,如上所述。

标签: pythonpython-requestsrobotframework

解决方案


使用的底层 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您的有效负载将按原样传递给requestspost 方法。您不需要明确设置标题,库会为您完成。

作为参数传递的是字典,值是部分的内容。如您所见,实际值是 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--

,这可能是你的目标。


推荐阅读