Python 使用robot framework请求库获取REST POST请求返回的文件
我正在测试REST服务器;它的一个服务提供一个文件作为响应。我使用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} =
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