背景: Robot Framework的新功能,但尝试将RequestsLibrary与OperatingSystem和XML一起使用,以在RIDE上自动执行一些REST测试。
要求: 使用XML正文发送文件,并在收到服务器的XML响应后进行验证。
问题: 当前设置导致500内部服务器错误。
是否可以将XML文件的内容发送到服务器而不是XML文件本身?
是否可以从服务器而不是响应代码返回响应的内容?
已经花了一段时间搜索指针,但没有发现任何过于有用的大多数请求和响应处理JSON而不是XML。
理想流程:
1)从目录
中的文件中提取XML文件内容2)作为POST请求发送到服务器URL
3)等待回复
4)返回此XML响应并验证它是否正确
CODE:
*** Settings ***
Library Collections
Library RequestsLibrary
Library XML
Library Selenium2Library
Library OperatingSystem
*** Test Cases ***
Example 1
Create Session Gateway https://GatewayURL.asmx
${file_data}= Get Binary File ${CURDIR}${/}data.xml
${files}= Create Dictionary ${file_data}
${response}= Post Request Gateway /post files=${files}
我已使用有用的建议添加到代码中。
Post request data in dictionary SAMPLE
Create Session Gateway URL HERE debug=3
${file_data}= Get Binary File ${CURDIR}${/}data.xml
&{data}= Create Dictionary name=${file_data.strip()}
&{headers}= Create Dictionary Content-Type=text/xml
${resp}= Post Request Gateway /post data=${data} headers=${headers}
Should Be Equal As Strings ${resp.status_code} 200
N.B URL HERE因此遗憾无法共享此网址。
失败如下。当这个数据用于标题时,不确定为什么数据是text / xml。这导致服务器500错误。
Post Request using : alias=Gateway, uri=/post, data=<text/xml>, headers={u'Content-Type': u'text/xml'}, files=None, allow_redirects=True
500 != 200
我想发送XML文件的内容而不是XML文件本身,因为服务器“不知道如何处理”文件,但能够“处理”XML文件的实际内容。
在RF不接受发布请求关键字的数据参数之前,您是否遇到过此问题?由于某种原因,它始终使用数据的Header参数......
答案 0 :(得分:0)
来自python的Response object库的Put Request
(以及lib中的其他请求类型)返回requests。因此,您可以完全访问其属性和方法,如上面的链接所述。
例如,如果您想要响应的有效负载:
Log To Console ${response.text}
${payload}= Set Variable ${response.text}
# process/verify the server's responose, it's now in the ${payload} variable
(如果服务器的响应不是Unicode,您可能需要检查text
的文档并明确设置正确的
另一个例子 - 如果你需要一个特定的标题:
Log To Console ${response.headers['content-encoding']}
# or, this will print them all:
Log To Console ${response.headers}
最后一个例子,响应的状态代码:
Should Be Equal As Strings ${response.status_code} 200
RE:更新的问题,如何实际发送带有PUT请求的文件。在您显示的代码中,出现此错误 - 您正在此处阅读文件:
...
${file_data}= Get Binary File ${CURDIR}${/}data.xml
然后,将其内容作为值存储在字典中:
&{data}= Create Dictionary name=${file_data.strip()}
将字典作为有效载荷发送:
${resp}= Post Request Gateway /post data=${data} headers=${headers}
我非常怀疑这是在接收服务的规范中 - 很可能它期望有效载荷中文件的内容;此外,它可能希望文件名为name
标题(但我在这里猜测,适应实际的要求)。所以流程可能是:
Create Session Gateway URL HERE debug=3
${file_data}= Get Binary File ${CURDIR}${/}data.xml
&{headers}= Create Dictionary Content-Type=text/xml name=data.xml
${resp}= Post Request Gateway /post data=${file_data} headers=${headers}
Should Be Equal As Strings ${resp.status_code} 200
无论如何,这是一个不知道服务的猜谜游戏;如果^没有帮助,请检查其日志并与开发人员交谈 - 请求的正确格式是什么。