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

2024-04-18 22:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用RequestsLibrary在Robot框架中用“Content-Type:multipart/formdata”发出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框架的RequestsLibrary实际上是否支持发送带有“Content-Type:multipart/formdata”的POST请求?,如果是,如何完成?在

PS:我正在使用Robot框架在Windows 10和{}一起使用。 POST请求实际上是被发送的,但是它不包含Content-Type头,也不包含表单数据负载,如上所述。在


Tags: 框架apidataresponsetypeusernamerobotcontent
1条回答
网友
1楼 · 发布于 2024-04-18 22:19:47

使用的底层python库-requests,在处理多部分“表单数据”内容时有一些特殊之处。它使用It primary作为请求的一部分发送文件(上传功能);粗略地说,当它解析参数时,它会剥离头,因为没有要发送的文件。另外,如果它没有做到这一点,它也不会被设计用来扣除多部分负载中的不同部分,例如,它不会自动将每个键值对放在一个单独的部分中。在

为了克服这个问题,通常使用files参数,将不同部分的内容作为参数传递。在执行此操作时,requests库将自动设置表单数据头,并将内容分成若干部分。
下面是如何在RF中做到这一点,解释如下:

${data}=    Evaluate    {'username': (None, 'myusername'), 'password': (None, 'mypwd')}
${response}=  Post Request  ${Session_id}  ${AUTH_TOKEN_URL_PATH}  files=${data}

使用Post Request关键字中的files参数,您的负载将按原样传递给requestspost方法。你不需要显式地设置头,库会为你做的。在

作为参数传递的是一个字典,如果值是部分的内容。如您所见,实际值是python元组,因为您希望覆盖部件中的文件名。用一个例子更好地解释了这一点;如果数据是这样的,那么值就是一个简单的sting:

^{pr2}$

,则有效载荷将显示为:

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

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

mypwd
 7579227dh785568ha91866339229add786 

请注意,每个部分都有一个“filename”属性,它等于参数名。在

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

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

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

mypwd
 7579227dh785568ha91866339229add786 

,这可能是你的目标。在

相关问题 更多 >