2

如果请求包含 Accept=application/xml,我正在尝试将 json 响应转换为 xml。否则,应返回 json 响应。

这是我的政策:

<policies>
  <inbound><base /></inbound>
  <backend><base /></backend>
  <outbound>
    <base />
    <json-to-xml apply="content-type-json" consider-accept-header="true" />
  </outbound>
  <on-error><base /></on-error>
</policies>

当我在没有 Accept 标头的情况下对此进行测试时,一切都很好(200 OK 并且正确返回了 json)。

但是,添加接受标头,我得到 406 Not Acceptable。

可在https://gist.github.com/jhgbrt/9df92cb0a140804ea01c获得已编辑的跟踪(添加标头 Ocp-Apim-Trace:true 后)。在该跟踪中,您将看到以下内容:

  • 在“入站”部分确认存在具有值“应用程序/xml”的请求标头“接受”。该request-executor块包含一条消息,说明“请求正在转发到后端服务”。
  • 在“出站”块中,您已经看到 406 不可接受并删除了 Accept 标头,之后 json-to-xml 块因此而失败。

我错过了什么?

4

1 回答 1

2

我怀疑问题在于您的后端 API 不支持返回application/xml,并且选择返回 406 而不是忽略接受标头而只返回 JSON。

解决此问题的一种方法可能是(我也会尝试)是将接受标头存储在变量中<set-variable>,使用策略从入站请求中删除 Accept 标头<set-header>,然后在出站时使用<choose>策略检查变量,并且仅在接受标头为application/xml

这个策略应该有效,尽管我必须承认我在转换 JSON 时遇到了一些问题。

<policies>
    <inbound>

        <choose>
            <!-- Check for application/xml in the Accept Header -->
            <when condition='@(context.Request.Headers.GetValueOrDefault("Accept","").Contains("application/xml"))'>

                <!-- Update the accept header to ask for JSON -->
                <set-header name="Accept" exists-action="override">
                    <value>application/json</value>
                </set-header>

                <!-- Create flag to record that we switched accept header -->
                <set-variable name="ToXml" value="True" />
            </when>
            <otherwise>
                <set-variable name="ToXml" value="False" />
            </otherwise>
        </choose>

        <base/>
    </inbound>
    <backend>
        <base/>
    </backend>
    <outbound>
        <base/>
        <choose>
            <!-- If we switched the accept header, then apply conversion -->
            <when condition='@((string)context.Variables["ToXml"] == "True")'>
                <json-to-xml apply="always" consider-accept-header="false" />
            </when>
        </choose>
    </outbound>
</policies>
于 2015-11-23T17:44:22.707 回答