【问题标题】:Passing --form data as part of ROBOT Framework传递 --form 数据作为 ROBOT 框架的一部分
【发布时间】:2022-04-09 04:25:58
【问题描述】:

我正在尝试在 ROBOT 框架中传递以下 API 请求:

curl --request POST --url <API End Point>  --form 'mldata={"id": “idname”, "author": “author name, "title": “title name, "description": “description details“, "version": "0.0.4", "image": “/path/to/image”, "icon": "base64 encoded image"};type=application/json' --header "Authorization: <Bearer Token>”

在 ROBOT 框架 [版本:3.2.2] 中编写相同,但得到 error: "status=400, reason=Bad Request body={"message":"Request is not a multipart request!"}"强文本

看来我没有以正确的方式传递 --form 数据。 请求帮助传递表单数据 [--form 'mldata={"id": "idname", "author": "author name, " title": "标题名称", "description": "description details", "version": "0.0.4", "image": "/path/to/image", "icon": "base64 编码图像"}; type=application/json'] 在机器人框架中。

我应该如何正确通过?

Onboard ML From External Repo
    [Arguments]    ${token}=default
    Create Session    session    ${host}
    ${data}=    Create Dictionary    id=${id}    author=${author}    title=${title}    description=${description}    version=${version}    image=${repo_path}
    ${form_data}=    Evaluate    {'mldata=': ${data}}
    ${header}=    Create Dictionary    Authorization=${token}
    ${response}=   Post Request    session    /v1/ml    data=${form_data}    headers=${header}
    Should Be Equal As Strings    ${response.status_code}    200

【问题讨论】:

    标签: robotframework


    【解决方案1】:

    我尝试了下面的代码,它成功了。我对原帖做了两处修改。

    1. 没有创建字典,而是直接评估所有项目
    2. 在 post 请求中传递 'files' 而不是 'data',对于多表单请求,文件是必需的。
    Onboard ML From External Repo
        [Arguments]    ${token}=default
        Create Session    mxesession    ${host}
        # ${data}=    Create Dictionary    id=${id}    author=${author}    title=${title}    description=${description}    version=${version}    image=${repo_path}    "icon": ${icon_image}
        ${form_data}=    Evaluate    {'mldata': (None,'{"id": "${id}", "author": "${author}", "title": "${title}", "description": "${description}", "version": "${version}", "image": "${repo_path}", "icon": "${icon_image}"}')}
        # ${form_data}=    Evaluate    {'mldata': "'"+${data}+"'"}
        # ${form_data}=    Evaluate    {'mldata': str(${data})}
        # ${form_data}=    Evaluate    {'mldata': (None,str(${data}))}
        # ${form_data}=    Evaluate    {'mldata': (None,${data})}
        ${header}=    Create Dictionary    Authorization=${token}
        ${response}=   Post Request    mxesession    /v1/ml    files=${form_data}    headers=${header}
        Should Be Equal As Strings    ${response.status_code}    200
    

    我不确定它是否是传递多格式数据的正确方法,但它在我的情况下有效。如果有人有更好的可行想法,请发表评论。将这段代码改进为更好的形状对我很有帮助。

    根据@PDHide cmets 更新了答案。

    Onboard ML From External Repo
        [Arguments]    ${token}=default
        Create Session    mxesession    ${host}
        ${data}=    Create Dictionary    id=${id}    author=${author}    title=${title}    description=${description}    version=${version}    image=${repo_path}    "icon": ${icon_image}
        ${form_data}=    Evaluate    {'mldata=': str(${data}).replace("'",'"')}
        ${header}=    Create Dictionary    Authorization=${token}
        ${response}=   Post Request    mxesession    /v1/ml    files=${form_data}    headers=${header}
        Should Be Equal As Strings    ${response.status_code}    200
    

    附:感谢@PDHide 的支持。

    【讨论】:

      【解决方案2】:

      它应该作为一个字符串发送,你也不需要相等

      ${form_data}=    Evaluate    {'mldata=': str(${data}).replace("'",'"')}
      

      正如您所观察到的,我们必须将其传递为

      files=${form_data} 
      

      【讨论】:

      • 这次我收到错误:Evaluating expression '{'mldata': "'"+{'id': 'idname', 'author': 'author name', 'title': 'title name', 'description': 'description details', 'version': '0.0.1', 'image': '/path/to/image', 'icon': 'base64 encoded image'}+"'"}' failed: TypeError: can only concatenate str (not "dict") to str
      • 更新了答案你可以试试新的答案
      • 我尝试了更新,但又回到了同样的错误:status=400, reason=Bad Request body={"message":"Request is not a multipart request!"}。另外,我从响应中检查了正文。它显示为:body={"mldata": "{'id': 'idname', 'author': 'author name', 'title': 'title name', 'description': 'description details', 'version': '0.0.1', 'image': '/path/to/image', 'icon': 'base64 encoded image'}"}。它似乎没有作为表单数据传递。
      • 理想情况下它应该显示为'mldata={"id": “idname”, "author": “author name, "title": “title name, "description": “description details“, "version": "0.0.1", "image": “/path/to/image”, "icon": "base64 encoded image"}'。我说的对吗?
      • 您使用哪个机器人框架库发送此请求?
      【解决方案3】:

      这就是为我工作的结果。对于其他有此问题的人

      ${data}=    Evaluate    {'username': (None, 'myusername'), 'password': (None, 'mypwd')}
      ${response}=  Post Request  ${Session_id}  ${AUTH_TOKEN_URL_PATH}  files=${data}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-27
        • 2012-03-19
        • 2012-09-16
        • 1970-01-01
        • 2017-05-04
        • 2021-09-28
        • 2018-03-26
        • 2018-01-31
        相关资源
        最近更新 更多