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