Azure API管理策略-pass x-www-form-urlencoded body
我有一个旧的ASMXWeb服务,可以像这样使用postman调用它 我想通过API管理将其公开为JSON端点,然后制定转换XML的策略,但我不确定如何在策略中设置请求细节 我在下面尝试过这样做(及其变体),但我总是收到错误消息“requestXML丢失”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
<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以发布到后端