使用请求库通过Robot Framework发出PUT请求

时间:2018-01-25 10:29:40

标签: xml rest request xmlhttprequest robotframework

背景: 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参数......

1 个答案:

答案 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

无论如何,这是一个不知道服务的猜谜游戏;如果^没有帮助,请检查其日志并与开发人员交谈 - 请求的正确格式是什么。