415 不支援的媒體類型 - 不支援的編碼

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式收到 HTTP 狀態碼 415 Unsupported Media Type, 錯誤代碼 protocol.http.UnsupportedEncoding 做為 API 呼叫的回應。

錯誤訊息

用戶端應用程式會取得下列回應代碼:

HTTP/1.1 415 Unsupported Media Type

此外,您可能也會看到類似以下的錯誤訊息:

{
   "fault":{
      "faultstring":"Unsupported Encoding \"UTF-8\"",
      "detail":{
         "errorcode":"protocol.http.UnsupportedEncoding"
      }
   }
}

可能原因

如果 Content-Encoding 標頭指定的值是 用戶端向 Apigee 或 HTTP 回應發出的 HTTP 要求 Apigee 並未提供 會依照規格,與 Apigee 的編碼支援相同 RFC 7231,6.5.13 節:415 不支援的媒體類型

造成這項錯誤的可能原因如下:

原因 說明 適用的疑難排解操作說明
要求中使用不支援的編碼 要求標頭 Content-Encoding 包含不支援的編碼 。 邊緣公有雲和私有雲使用者
回應中使用的不支援的編碼 後端伺服器回應標頭 Content-Encoding 包含的編碼 。 邊緣公有雲和私有雲使用者

常見的診斷步驟

如要診斷錯誤,您可以採用下列任一方法:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 登入 Apigee Edge 帳戶
  2. 切換至您要調查問題的機構:

    UI 機構下拉式選單
  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 確認「Proxy」篩選器已設為「All」。
  6. 根據「時間」繪製「Fault Code」指標。
  7. 選取含有錯誤程式碼 protocol.http.UnsupportedEncoding 的儲存格,如下所示:

    已選取錯誤程式碼儲存格
  8. 錯誤程式碼 protocol.http.UnsupportedEncoding 的相關資訊顯示如下:

  9. 按一下「查看記錄」 ,然後展開其中一個失敗的要求,並顯示 415 錯誤訊息:

  10. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 錯誤來源:這表示 apigee 傳回錯誤 或 target
    • 「Fault Code」:應與 protocol.http.UnsupportedEncoding 相符。
  11. 如果「Fault Source」apigee,表示要求 Content-Encoding 標頭包含不支援的編碼。
  12. 如果 Fault Source 為 target,表示後端伺服器 回應的 Content-Encoding 標頭包含不支援的編碼。

追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用 追蹤工作階段,然後執行下列任一操作:
    • 等待 415 Unsupported Media Type 錯誤發生,或
    • 如果可以重現問題,請發出 API 呼叫以重現問題 415 Unsupported Media Type 個錯誤。
  2. 確認已啟用「Show all FlowInfos」

    檢視選項窗格, 顯示所有流程資訊
  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗的部分。
  5. 錯誤通常會在「要求已傳送至目標」後於流程中發生。 伺服器階段,如下所示:

  6. 記下追蹤記錄中的錯誤值。

    上述追蹤記錄範例將錯誤顯示為 Unsupported Encoding "utf-8"。開始時間 要求傳送至後端伺服器後,Apigee 會發生這個錯誤, 後端伺服器傳送回應標頭 Content-Encoding 及其值 的 "utf-8",而不是 支援的編碼

  7. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  8. 向下捲動至「Phase Details」中的「Error / Response Headers」部分 判斷調查結果 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

  9. 您會看到 X-Apigee-fault-codeX-Apigee-fault-source 的值為 protocol.http.UnsupportedEncodingtarget,表示 錯誤是因為 "utf-8" 傳遞不支援的編碼值 ( 回應標頭 Content-Encoding

    回應標頭
    X-Apigee-fault-code protocol.http.UnsupportedEncoding
    X-Apigee-fault-source target

  10. 檢查您是否使用 建立 Proxy 鏈結也就是說,如果目標伺服器/目標端點叫用其他端點 使用 Proxy
    1. 如要判斷這種情況,請返回「要求傳送至目標伺服器」階段。 按一下「顯示 Curl」

    2. 系統會隨即開啟「Curl for Request Sent to Target Server」視窗,供您 判斷目標伺服器主機別名。
    3. 如果目標伺服器主機別名指向虛擬主機別名,表示該別名為 Proxy。 鏈結。在這種情況下,您需要針對鏈結的 Proxy 重複執行上述所有步驟,直到 判斷是 415 Unsupported Media Type 錯誤的真正原因。
    4. 如果目標伺服器主機別名指向您的後端伺服器,則表示 您的後端伺服器已將不支援的編碼傳送至 Apigee。

Nginix 存取記錄

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷 提供 HTTP 415 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. 搜尋特定期間的任何 415 錯誤 (如果問題發生的話) ),或是仍有任何要求因 415 而失敗。
  4. 如果在 X-Apigee-fault-code 比對中發現任何 415 錯誤 protocol.http.UnsupportedEncoding 的值,然後決定該值 是 X-Apigee-fault-source. 的多個節點。

    NGINX 存取記錄中的 415 錯誤示例:

    上述 NGINX 存取記錄的範例項目包含下列 X- Apigee-fault-code X-Apigee-fault-source:

    回應標頭
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source MP

    X-Apigee-fault-source 也可以有X-Apigee-fault-source X-Apigee-fault-source

原因:要求中有不支援的編碼

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 中所述監控或 NGINX 存取記錄 常見的診斷步驟
  2. 如果錯誤代碼protocol.http.UnsupportedEncoding錯誤 來源的值為 apigeeMP,表示 用戶端應用程式傳送的要求在要求標頭中加入不支援的編碼 Content-Encoding
  3. 您可以判斷在 HTTP 要求中傳遞不支援的編碼值 選擇下列其中一種做法:

    錯誤訊息

    使用錯誤訊息:
    1. 如果您可以存取 Apigee Edge 收到的完整錯誤訊息,可參閱 至 faultstringfaultstring 包含不支援的值 寫出。

      錯誤訊息示例:

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. 請注意,在上述錯誤訊息中,不支援的編碼值是 “UTF-8”,如 faultstring 中所示。

      “UTF-8” 不是 Apigee Edge 中支援的編碼,因此這個要求 失敗,並傳回 415 Unsupported Media Type 錯誤,錯誤代碼如下: protocol.http.UnsupportedEncoding

    實際要求

    使用實際要求:
    1. 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度
    2. 如果您可以存取用戶端應用程式所提出實際要求,請進行 步驟如下:
      1. 判斷傳遞至要求標頭 Content-Encoding. 的值
      2. 如果傳遞到要求標頭 Content-Encoding 的值不是 支援的編碼中所列值,則 發生這項錯誤的原因

        要求範例:

        curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: UTF-8" -X POST -d @request_payload.gz

        上述要求範例會將 "UTF-8" 值傳送至 Content- Encoding 標頭,而非 Apigee Edge 中支援的編碼。因此,這項要求會失敗,並傳回 415 Unsupported Media Type 錯誤,並傳回以下錯誤代碼: protocol.http.UnsupportedEncoding

解析度

  1. 請前往下列清單查看 Apigee 支援的編碼清單: 支援的編碼
  2. 確認用戶端應用程式一律傳送下列內容:
    • 只有支援的編碼是以下程式碼中的 Content-Encoding 標頭值: 要求
    • 以支援格式提供給 Apigee Edge 的要求酬載 已在 Content-Encoding 標頭中指定
  3. 在上述範例中,要求酬載包含 gz 擴充功能,指出 內容必須是 gzip。如要修正問題,請傳送要求標頭 做為 Content-Encoding: gzip,而要求酬載則採用 gzip 格式:

    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

原因:回應不支援編碼

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、追蹤工具或 NGINX 存取記錄 常見的診斷步驟
  2. 如果 Fault Source 的值為 target,則表示 則後端伺服器傳送的回應中含有不支援的編碼, Content-Encoding 標頭。
  3. 您可以判斷在 HTTP 回應中傳送不支援的編碼值, 透過下列其中一種方式載入後端伺服器:

    錯誤訊息

    使用錯誤訊息:
    1. 如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱 faultstringfaultstring 包含 不支援的編碼。

      錯誤訊息示例:

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. 請注意,在上述錯誤訊息中,不支援的編碼值是 “UTF-8”,如 faultstring 中所示。

      由於 “UTF-8” 並非 Apigee Edge 中支援的編碼,因此這會 要求失敗,並傳回 415 Unsupported Media Type 錯誤及錯誤代碼: protocol.http.UnsupportedEncoding

    追蹤工具

    使用 Trace:
    1. 如果無法取得失敗要求的追蹤記錄,請前往 解析度
    2. 如果您擷取失敗的追蹤記錄,則可以判斷不支援的 做為 Content-Encoding 回應的一部分,由後端伺服器傳遞的編碼 追蹤工具中所述的標頭。

解析度

  1. 請前往下列清單查看 Apigee 支援的編碼清單: 支援的編碼
  2. 確定後端伺服器一律傳送下列項目:
    • 只有支援的編碼做為 要求中的 Content-Encoding 標頭
    • 採用 Apigee Edge 支援格式的回應酬載,且符合格式 已在 Content-Encoding 標頭中指定

支援的編碼

下表列出 Apigee Edge 支援的編碼格式:

標頭 編碼 說明
Content-Encoding gzip Unix gzip 格式
deflate 這種格式使用 zlib 結構搭配延遲壓縮演算法。

規格

Apigee 按照 415 Unsupported Media Type 錯誤回應 下列 RFC 規格:

規格
RFC 7231,6.5.13 節:415 不支援的媒體類型

要點

注意事項:

  • 如果 Apigee 因傳入不支援的編碼而傳回 415 錯誤 Content-Encoding 標頭做為 API 要求的一部分,然後:
    • 您無法擷取這類要求的追蹤記錄。
    • 您將無法修改 傳送的錯誤回應格式或內容 Apigee Edge 使用 PromoteFault、AssignMessage 等政策的 Apigee Edge。

    這是因為錯誤發生在訊息處理器的早期階段 政策並位於

  • 如果 Apigee 因傳遞不支援的編碼而傳回 415 錯誤 回應標頭中,則必須修正 避免發生此錯誤請與後端團隊合作,以便 即可解決這個問題。

如果仍需 Apigee Edge 支援方面的任何協助, 請參閱「必須收集診斷資訊」。

必須收集診斷資訊

如果您仍需 Apigee 支援團隊的協助,請收集下列資訊 ,然後與 Apigee Edge 支援團隊聯絡:

如果您是公有雲使用者,請提供下列資訊:

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令 (用來重現 415 錯誤)
  • API 要求的追蹤檔

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 偵測到失敗要求的完整錯誤訊息
  • 環境名稱
  • API Proxy 套裝組合
  • API 要求的追蹤檔
  • NGINX 存取記錄 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為 實際價值

  • 訊息處理器系統記錄:/opt/apigee/var/log/edge-message- processor/logs/system.log