Python 使用robot framework请求库获取REST POST请求返回的文件

Python 使用robot framework请求库获取REST POST请求返回的文件,python,rest,python-requests,robotframework,Python,Rest,Python Requests,Robotframework,我正在测试REST服务器;它的一个服务提供一个文件作为响应。我使用robotframeworkrequests库调用服务。这是我的测试用例: *** Settings *** Library RequestsLibrary *** Test Cases *** Test RequestsLibrary.CREATE SESSION session http://192.168.100.139:9090 ${data} =

我正在测试REST服务器;它的一个服务提供一个文件作为响应。我使用
robotframeworkrequests
库调用服务。这是我的测试用例:

*** Settings ***
Library             RequestsLibrary


*** Test Cases ***
Test
    RequestsLibrary.CREATE SESSION      session     http://192.168.100.139:9090
    ${data} =       evaluate    json.load(open('/root/data.json', 'r'))   json
    log to console  Data: ${data}
    ${resp} =       RequestsLibrary.POST REQUEST    session  uri=/omc/simulator/api/generate   data=${data}
    log to console  Resp: ${resp}
这就是我得到的回报:

Data: {u'files': [{u'tags': [{u'name': u'l1', u'value': u'l2', u'level': 2}], u'counters': {u'count': 10, u'valueMin': 0, u'prefix': u'a1', u'specifics': [{u'valueMin': 0, u'valueMax': 10, u'name': u'a2', u'tags': {u'additionalProp3': u'a5', u'additionalProp2': u'a4', u'additionalProp1': u'a3'}}], u'valueMax': 10}}], u'to': u'2018-02-14T11:25:10.712Z', u'from': u'2018-02-14T11:05:10.712Z', u'intervalMillis': 300000}
Resp: <Response [415]>
对于
application/octet-stream
application/zip
(文件具有
.zip
扩展名)我仍然获得状态代码
415
,作为
${contentType}

编辑2:

我更改了服务器,以便将文件保存到一个目录中,以便使用它;但由于它不接受我的标题,我仍然无法完全调用该服务。我得到了
415
状态代码,它是从服务器发送的,这意味着我没有在
标题中正确设置
内容类型

顺便说一句,我将我的请求正文更改为@Todor推荐:

${data} =       evaluate    json.dumps(json.load(open('/root/data.json', 'r')))  json
${headers} =    Create Dictionary    Content-type=${contentType}
${headers} =    evaluate    json.dumps(${headers})
${resp} =       RequestsLibrary.POST REQUEST    session  uri=/omc/simulator/api/generate   data=${data}   headers=${headers}
但是我在application/octet-stream
application/zip
(该文件具有
.zip
扩展名)中都尝试了它,作为
${contentType};仍然得到相同的错误

**编辑3:**

我一直在使用错误的
内容类型
;我应该使用
application/json
。考虑到@Todor关于
标题
数据
的注释,我终于让它工作了

${data} =       evaluate    json.dumps(json.load(open('/root/data.json', 'r')))  json
${headers} =    Create Dictionary    Content-type=application/json
${resp} =       RequestsLibrary.POST REQUEST    session  uri=/omc/simulator/api/generate   data=${data}   headers=${headers}

有了这个错误响应,您可能错过了所需的标题,如
内容类型
;请检查应用程序的日志以确定。
下面是如何添加它:

# the previous code
${headers}=   Create Dictionary   Content-type=application/json
${resp} =       RequestsLibrary.POST REQUEST    session  uri=/omc/simulator/api/generate   data=${data}   headers=${headers}

代码还有另一个问题;这一行在这里:

${data} =       evaluate    json.load(open('/root/data.json', 'r'))   json
,将有效地加载提供的json文件,并将其转换为python对象(很可能是字典)。
然而,您不应该在请求中这样发送它-它必须被序列化回json格式(b/n json和python字典的字符串表示的最大区别-json不使用单引号作为分隔符)

因此,一旦你做到了这一点,你就可以:

${data} =       evaluate    json.dumps($data)   json

,这将把它转换回来。或者,只加载文件内容,而不进行前后转换。

您将如何手动执行-在rest客户端/curl/python
请求中创建的请求是什么?在那里取得成功,并在机器人框架中复制这一点;这只是自动化测试的一般化,但在这里完全适用。在框架中可行吗?当然,这只是表示执行步骤的另一种方式/分类法;它给了我一个下载文件的链接。我从来没有下载过任何代码;那里印的是什么?服务的规格是什么?它在这个post请求中期望的格式是什么?它生成的文件链接的类型是不相关的-你没有达到这一点:),所以不要将其设置为
application/zip
。在编写post请求时,必须通知服务请求有效负载中的数据类型-这就是
内容类型
头的用途。当您发送json时——根据示例代码判断,正确的应该是
application/json
@Todor,您是对的。我编辑了答案。
${data} =       evaluate    json.dumps($data)   json