簡體   English   中英

在 azure api 管理服務中更改響應主體

[英]Change response body in azure api management service

我正在使用json 占位符 api測試 APIm 的GET請求,並且無法替換我的響應正文。 任何幫助表示贊賞!

JSON 回復:

{
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
}

這是我的政策:

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
 <base />
<choose>
  <when condition="@(context.Response.StatusCode == 200)">
    <set-body>@{
        var response = context.Response.Body.As<JObject>();
        response["id"] = "Hello World!";
        return response.ToString();
      }
    </set-body>
  </when>
</choose>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

我最終遇到了這個錯誤:

set-body (7.739 ms) { “messages”: [ { “message”: “Expression evaluation failed.”, “expression”: “\n var response = context.Response.Body.As();\n response[” id"] = 2;\n return response.ToString();\n ", "details": "消息正文不是有效的 JSON。解析值時遇到意外字符:�. 路徑 '',第 0 行,position 0.\r\n 在 Newtonsoft.Json.JsonTextReader.ParseValue()\r\n 在 Newtonsoft.Json.Linq.JObject.Load(JsonReader 閱讀器,JsonLoadSettings 設置)\r\n 在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway。 MessageBody.AsJObject(Stream stream, Encoding 編碼, JsonSerializerSettings 設置)\r\n at Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.As[T](Boolean preserveContent)" }, "表達式計算失敗。消息正文是不是有效的 JSON。解析值時遇到意外字符:�. 路徑“”,第 0 行,position 0.\r\n 在 Newtonsoft.Json.JsonTextReader.P arseValue()\r\n 在 Newtonsoft.Json.Linq.JObject.Load(JsonReader 閱讀器,JsonLoadSettings 設置)\r\n 在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.AsJObject(流 stream,編碼器編碼,JsonSerial 設置) \r\n 在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.As[T](Boolean preserveContent)","解析值時遇到意外字符:�。 路徑 '',第 0 行,position 0。"] }

更新 1:

執行此策略並顯示正文為null 有沒有辦法等待響應體? 當我在 vscode 中調試它並逐步執行它時,我成功獲得了響應。 這是我的新出境政策:

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <return-response>
            <set-header name="Content-Type">
                <value>application/json</value>
            </set-header>
            <set-header name="Accept">
                <value>application/json</value>
            </set-header>
            <set-body>@{
            JObject body = null;
        try {
            body = context.Response.Body.As<JObject>(preserveContent: true);
            return  "{\"id\":"+ @body["type"] + "}";

        } catch (Exception e) {
            return JsonConvert.SerializeObject(context.Response.Body);
        }
        }
        </set-body>
        </return-response>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

更新 2

添加了一個跟蹤:

<trace source="test">
    <message>@{
        return context.Response.Body.As<string>(preserveContent: true);
    }</message>
</trace>

跟蹤結果:

test (0.006 ms)
"��\u0002\u0000 ���%\u001d�WV\rm%\n:\u0018�˫�y�ȁ[�P۝߁��>�\u0000�w9\u0015s\b�èS7���˻\u0013�\u0005늇>qs*��\f�\u0001"

將 header 設置為Accept-Encoding: *給了我一個成功的回應。 我以為Content-Type: application/json; charset=utf-8 Content-Type: application/json; charset=utf-8足以進行編碼。 我需要更深入地研究 Accept-Encoding,但是當我在跟蹤中看到錯誤時,它看起來像是一個編碼問題,這就是我得出解決方案的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM