【问题标题】:Azure API Management - How to send body along with my requestAzure API 管理 - 如何连同我的请求一起发送正文
【发布时间】:2020-05-25 13:18:15
【问题描述】:

我在 Azure 上托管了一个 API,并且我已经开始使用 Azure API 管理。我的 API 端点之一是 GET,它需要将 JSON 形式的主体传递给端点。在我的邮递员上,我能够点击实际的 API(托管在 Azure 上)并发送正文,我能够得到一些结果。但是当我尝试在 azure api management 上点击 api 时,我收到以下异常,尽管我正在发送请求正文:

{
    "errors": {
        "": [
            "A non-empty request body is required."
        ]
    },
    "type": "https://tools.ietf.org/html/rfcXXXX#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

我是否缺少有关 Azure Api 管理的一些配置?我确实查找了设置的策略,并且在入站时使用了以下内容,但这仍然无法正常工作

<set-header name="Content-Type" exists-action="override">
    <value>application/json</value>
</set-header>
<set-body template="liquid">{{body.json}}"}</set-body>

任何有关我如何解决此问题的见解将不胜感激。提前致谢。

【问题讨论】:

  • &lt;set-body&gt;@{ JObject inBody = context.Request.Body.As&lt;JObject&gt;(); return inBody.ToString(); }&lt;/set-body&gt;看看能不能拿到trace中的body内容。

标签: azure api azure-api-management


【解决方案1】:

我可以使用以下策略来设置 GET 请求正文。

<inbound>
    <base />
    <set-header name="Content-Type" exists-action="override">
        <value>application/json</value>
    </set-header>
    <set-body template="liquid">{"QueryString": "123", "param1": "456"}</set-body>
    <set-body>@{ 
        JObject inBody = context.Request.Body.As<JObject>(); 
        return inBody.ToString(); 
    }</set-body>
</inbound>

当我测试它时,我可以看到它已成功添加到正文中。我也可以通过context.Request.Body.As&lt;JObject&gt;()获取。

我注意到您的正文是{{body.json}}"},格式似乎不正确。您应该使用{{body.json}} 并确保body.json 包含准确的内容。

【讨论】:

    【解决方案2】:

    根据规范:https://www.rfc-editor.org/rfc/rfc7231#section-4.3.1 与 GET 请求一起发送的正文没有定义的行为,这样的请求可能会被完全拒绝。

    【讨论】:

      【解决方案3】:

      如果您尝试使用流动模板来查询文档/json,您可以按照这个简短的示例进行操作。注意我们需要知道文档信息,以便查询它的属性。

      示例文档(邮递员请求)

      {
         "data": {"message":"hi"}
      }
      
      <set-body template="liquid">
      {
       {% if body.data %}
      
          // you can also add guards for objects and arrays
          // {i.e. }if body.data.messages
         "message": {{body.data.message}}     
          
       {%else%} 
      
        "message": "error no data"               
      
       {% endif %}
      }
      </set-body>
      

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多