Robotframework.request-如何发出内容为“ multipart / form-data”的POST请求

时间:2018-11-24 22:37:08

标签: python python-requests robotframework

我想使用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上使用Robot Framework。 POST请求实际上是发送的,但是它不包含Content-Type标头,也不包含表单数据有效载荷,如上所述。

1 个答案:

答案 0 :(得分:3)

所使用的基础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--

请注意每个部分如何具有“文件名”属性,该属性等于参数名。

当值为元组时,其第一个成员设置零件的“文件名”属性;而当它是None时,根本没有“文件名”,从而产生以下结果:

--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="username"

myusername
--7579227dh785568ha91866339229add786
Content-Disposition: form-data; name="password"

mypwd
--7579227dh785568ha91866339229add786--

,这可能是您的目标。