从机器人框架请求库

时间:2018-02-14 12:25:53

标签: python rest python-requests robotframework

我正在测试REST服务器;其中一个服务提供了一个响应文件。我使用robotframework-requests库来调用服务。这是我的测试用例:

*** 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]>

415 HTTP代码的含义为Unsupported Media Type

如何获得提供的文件以及如何配置下载路径?在robotframeworkpython进行编码是否可行?

编辑1:

我已尝试将Content-Type设置为@Todor建议的请求标头:

${headers} =    Create Dictionary    Content-Type=${contentType}
${resp} =       RequestsLibrary.POST REQUEST    session  uri=/omc/simulator/api/generate   data=${data}   headers=${headers}

我仍然会将415application/octet-stream(文件的扩展名为application/zip)的状态代码.zip设为${contentType}

编辑2:

我更改了服务器以便将文件保存到目录中,所以我可以使用它;但由于它不接受我的标题,我仍然无法完全调用该服务。我收到了415状态代码,该代码是从服务器发送的,暗示我没有在Content-type中设置正确header

顺便说一句,我改变了我的请求体,因为@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 and application / zip (the file has。zip extension) as $ {contentType}`;仍然得到同样的错误。

**编辑3:**

我一直使用错误的Content-type;我应该使用application/json。考虑到@Todor关于headerdata的说明,我终于明白了。

${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}

1 个答案:

答案 0 :(得分:1)

有了这个错误回复,您可能错过了必需的标题,例如content-type;检查您应用的日志以确定 以下是如何添加它:

# 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不使用单引号{{1}作为分隔符)。

所以一旦你完成了这个,你就可以做到:

'

,它将把它改回来。或者,只需加载文件内容,而不是执行此前后转换。