Azure API管理策略-pass x-www-form-urlencoded body

Azure API管理策略-pass x-www-form-urlencoded body,azure,azure-api-management,Azure,Azure Api Management,我有一个旧的ASMXWeb服务,可以像这样使用postman调用它 我想通过API管理将其公开为JSON端点,然后制定转换XML的策略,但我不确定如何在策略中设置请求细节 我在下面尝试过这样做(及其变体),但我总是收到错误消息“requestXML丢失” <set-body template="liquid"> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soa

我有一个旧的ASMXWeb服务,可以像这样使用postman调用它

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

我在下面尝试过这样做(及其变体),但我总是收到错误消息“requestXML丢失”

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

requestXml:“CHCA”
应用程序/x-www-form-urlencoded

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

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

1.如果您想测试将requestXml传递到后端的硬代码,正确的格式应该是
requestXml=xxxx
,而不是
requestXml:xxxx
,因为您使用“x-www-form-urlencoded”作为内容类型(在postman中,我们可以使用
requestXml:xxxx
)。因此,apim的政策应该是:

<set-body>requestXml=<Request Caller="Harness"><GetEmployerOfferings><EmployerCode>CHCA</EmployerCode></GetEmployerOfferings></Request></set-body>
requestXml=CHCA
但是,由于您的主体包含xml
,因此它将在保存策略后自动删除
CHCA
。只留下
requestXml=
,所以用硬代码测试可能不会成功

2.据我所知,如果您希望请求APIM提供json数据,如下所示:

{
    "getEmployerOfferings": {
        "requestXml": "<Request Caller=\"Harness\"><GetEmployerOfferings><EmployerCode>CHCA</EmployerCode></GetEmployerOfferings></Request>"
    }
}
{
“GetEmployeerOfferings”:{
“requestXml”:“CHCA”
}
}
如果您的请求与上面的示例类似,您可以参考下面的策略:

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

@{
var request=context.request.Body.As();
var xmlstring=request[“GetEmployeerOfferings”][“requestXml”].ToString();
var result=“requestXml=”+xmlstring;
返回结果;
}
应用程序/x-www-form-urlencoded
测试apim,我们可以在操作后找到最终的请求主体,它显示:

您的JSON请求正文是什么样子的?我现在只是尝试硬编码将requestXml传递到后端,但是我的JSON请求看起来是这样的…{“getEmployerOfferings”:{“requestXml”:“sample”}您是指您上面提供的JSON中的
“sample”
?您希望使用json中的请求主体请求apim,但json的属性
requestXml
仍然是xml?您是对的。正确的格式需要是requestXml=。我还去掉了“肥皂:信封”标签,像你说的那样做了一个笔直的测试。此外,我在APIM中将其设置为Get方法,并在策略中将其更改为Post以发布到后端