【问题标题】:API Management Policy - pass x-www-form-urlencoded bodyAPI 管理策略 - 通过 x-www-form-urlencoded 正文
【发布时间】:2020-09-03 08:57:42
【问题描述】:

我有一个旧的 asmx 网络服务,可以像这样使用邮递员调用

我想通过 API 管理将其公开为 JSON 端点,然后制定转换 XML 的策略,但我不确定如何在策略中设置请求详细信息

我已尝试在下面执行此操作(及其变体),但我总是收到消息错误“requestXML is missing”

<set-body template="liquid">
            <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <soap:Body>
                    requestXml: "<Request Caller="Harness"><GetEmployerOfferings><EmployerCode>CHCA</EmployerCode></GetEmployerOfferings></Request>"
                </soap:Body>
            </soap:Envelope>
        </set-body>
        <set-header name="Content-Type" exists-action="override">
            <value>application/x-www-form-urlencoded</value>
        </set-header>

如何通过 APIM 策略将其传递给后端服务?

【问题讨论】:

  • 您的 JSON 请求正文是什么样的?
  • 我现在只是尝试硬编码将 requestXml 传递到后端,但我的 json 请求看起来像这样...{ "getEmployerOfferings": { "requestXml": "sample" } }
  • 你的意思是你上面提供的json中的"sample"是指&lt;Request Caller="Harness"&gt;&lt;GetEmployerOfferings&gt;&lt;EmployerCode&gt;CHCA&lt;/EmployerCode&gt;&lt;/GetEmployerOfferings&gt;&lt;/Request&gt;吗?你想用json中的请求体请求apim,但是json的属性requestXml还是xml?

标签: azure azure-api-management


【解决方案1】:

对于您的要求,正如我在评论中询问的那样,我对您的 json 样本有点困惑。但我也可以提供一些信息供您参考。

1.如果你想测试将requestXml传递给后端的硬代码,正确的格式应该是requestXml=xxxx而不是requestXml:xxxx,因为你使用了“x-www- form-urlencoded" 为 content-type(在邮递员中我们可以使用requestXml:xxxx)。所以apim中的策略应该是:

<set-body>requestXml=<Request Caller="Harness"><GetEmployerOfferings><EmployerCode>CHCA</EmployerCode></GetEmployerOfferings></Request></set-body>

但是由于你的 body 包含 xml &lt;&gt;,所以它会在保存策略后自动删除 &lt;Request Caller="Harness"&gt;&lt;GetEmployerOfferings&gt;&lt;EmployerCode&gt;CHCA&lt;/EmployerCode&gt;&lt;/GetEmployerOfferings&gt;&lt;/Request&gt;。只留下&lt;set-body&gt;requestXml=&lt;/set-body&gt;,所以用硬代码测试可能不会成功。

2.据我了解,如果您想使用以下 json 数据请求 APIM:

{
    "getEmployerOfferings": {
        "requestXml": "<Request Caller=\"Harness\"><GetEmployerOfferings><EmployerCode>CHCA</EmployerCode></GetEmployerOfferings></Request>"
    }
}

如果你的请求json像上面的样例,你可以参考下面的策略:

<inbound>
    <base />
    <set-body>@{
        var request = context.Request.Body.As<JObject>();
        var xmlstring = request["getEmployerOfferings"]["requestXml"].ToString();
        var result = "requestXml=" + xmlstring;
        return result;
    }</set-body>
    <set-header name="Content-Type" exists-action="override">
        <value>application/x-www-form-urlencoded</value>
    </set-header>
</inbound>

测试apim,我们可以找到运行后的最终请求体,它显示:

【讨论】:

  • 你是对的。正确的格式需要是 requestXml=。我还删除了 soap:envelope 标签,并像你说的那样做了一个直接的 。此外,我在 APIM 中将其设置为 Get 方法,并在策略中将其更改为 Post 以发布到后端
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多