将响应转发到其他URL时,将响应主体从XML转换为API管理策略表达式中的Json

时间:2019-09-18 12:46:55

标签: c# html xml razor azure-api-management

将响应转发到另一个URL时,如何将响应主体从XML更改为Json?

我专门将响应转发到Azure Service Bus。

我尝试了许多不同的方法将XML序列化为json,但是由于策略表达式中不允许使用的某些JsonConvert方法的限制,所以运气不佳。

不,<json-to-xml apply="content-type-json" consider-accept-header="true" />不是解决方案:)

<outbound>
    <base />
        <send-request mode="new" response-variable-name="response_body" timeout="60" ignore-error="true">
            <set-url>https://servicebus.fake</set-url>
            <set-method>POST</set-method>
            <set-header name="Authorization" exists-action="override">
                <value>@{

                  // some code to construct the token key that's needed for service bus requests.

                  }
                </value>
            <set-header name="MessageId" exists-action="skip">
                <value>@{
                  var guid = Guid.NewGuid().ToString();
                  return guid;
                  }
                </value>
            </set-header>
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
                <set-body>@{

                        // What must I add here?
                }
                </set-body>
       </send-request>
       <set-header name="Content-Type" exists-action="override">
            <value>application/json</value>
        </set-header>
    </outbound>

1 个答案:

答案 0 :(得分:1)

这是解决方案:)策略表达式中不允许使用典型的JsonConvert.SerializeXmlNode方法。

然而,JsonConvert.SerializeObject的出色表现可以达到目的。

<send-one-way-request mode="new">
    <set-url>http://requestb.in/xje199xj</set-url>
    <set-method>POST</set-method>
    <set-header name="Content-Type" exists-action="override">
    <value>application/json</value>
    </set-header>
        <set-body>@{
            string xml = context.Response.Body.As<string>(preserveContent: true);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            return JsonConvert.SerializeObject(doc);
            }
        </set-body>
</send-one-way-request>