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

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

用戶端應用程式會取得 415 Unsupported Media Type 的 HTTP 狀態碼,以及錯誤代碼 protocol.http.UnsupportedEncoding 來回應 API 呼叫。

錯誤訊息

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

HTTP/1.1 415 Unsupported Media Type

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

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

可能原因

根據 RFC 7231 第 6.5.13 節:415 不支援的媒體類型,在用戶端傳送至 Apigee 的 HTTP 要求或後端伺服器傳送給 Apigee 的 HTTP 要求中,如果指定 Content-Encoding 標頭的值不包含 Apigee 所支援的編碼功能,就會發生這個錯誤。

此錯誤可能的原因如下:

原因 說明 適用的疑難排解指示
要求中使用了不支援的編碼 要求標頭 Content-Encoding 包含 Apigee Edge 不支援的編碼。 Edge Public and Private Cloud 使用者
回應中使用不支援的編碼 後端伺服器回應標頭 Content-Encoding 包含 Apigee Edge 不支援的編碼。 Edge Public and Private Cloud 使用者

常見診斷步驟

您可以使用下列任一方法診斷錯誤:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

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

    UI 機構下拉式選單
  3. 前往「分析」>「API 監控」>「調查」頁面。
  4. 請選取你發現錯誤的特定時間範圍。
  5. 確認「Proxy」篩選器已設為「全部」
  6. 將「Fault Code」與「Time」進行比較。
  7. 選取含有錯誤代碼 protocol.http.UnsupportedEncoding 的儲存格,如下所示:

    已選取故障碼儲存格
  8. 錯誤代碼 protocol.http.UnsupportedEncoding 的資訊如下所示:

  9. 按一下「查看記錄檔」 ,然後展開其中一個失敗且出現 415 錯誤的要求,以便查看詳細資訊:

  10. 在「記錄檔」視窗中記下下列詳細資料:
    • Fault Source (Fault 來源):這表示 apigeetarget 傳回錯誤。
    • Fault Code (Fault Code):這應與 protocol.http.UnsupportedEncoding 相符。
  11. 如果「Fault Source」apigee,表示要求在 Content-Encoding 標頭中包含不支援的編碼。
  12. 如果錯誤來源是 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",但該值在 Apigee 中並非支援編碼

  7. 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
  8. 在「階段詳細資料」面板中向下捲動至「錯誤 / 回應標頭」部分,確定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

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

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

  10. 請檢查您是否正在使用 Proxy 鏈結,也就是目標伺服器/目標端點是否在 Apigee 中叫用其他 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 protocol.http.UnsupportedEncoding 的值相符時發現任何 415 錯誤,請檢查 X-Apigee-fault-code 的值。

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

    以上 NGINX 存取記錄中的範例項目,針對 X- Apigee-fault-codeX-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 存取記錄檔,找出錯誤的「Fault Code」和「Fault Source」,詳情請參閱 常見診斷步驟
  2. 如果「Fault Code」protocol.http.UnsupportedEncoding,且「Fault Source」值為 apigeeMP,表示用戶端應用程式傳送的要求在要求標頭 Content-Encoding 中包含不支援的編碼。
  3. 您可以使用下列其中一種方法,判斷在 HTTP 要求中傳遞不支援的編碼值:

    錯誤訊息

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

      錯誤訊息示例:

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

      由於 Apigee Edge 不支援 “UTF-8”,因此這項要求會失敗,並顯示 415 Unsupported Media Type 錯誤並顯示錯誤代碼:protocol.http.UnsupportedEncoding

    實際要求

    使用實際要求:
    1. 如果您無法存取用戶端應用程式發出的實際要求,請前往「Resolution」
    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 監控、追蹤記錄工具或 NGINX 存取記錄檔,找出錯誤的「Fault Code」和「Fault Source」,詳情請參閱常見診斷步驟
  2. 如果「Fault Source」的值為 target,表示後端伺服器傳送的回應在 Content-Encoding 標頭中包含不支援的編碼。
  3. 您可以使用下列其中一種方法,從後端伺服器將不支援的編碼做為 HTTP 回應的一部分傳遞:

    錯誤訊息

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

      錯誤訊息示例:

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

      由於 Apigee Edge 不支援 “UTF-8”,因此這項要求會失敗,並發生 415 Unsupported Media Type 錯誤並發生以下錯誤代碼:protocol.http.UnsupportedEncoding

    追蹤工具

    使用 Trace:
    1. 如果沒有失敗要求的追蹤記錄,請前往「Resolution」
    2. 如果您已擷取失敗的追蹤記錄,就可以按照追蹤記錄工具的說明,判斷後端伺服器傳遞的不支援編碼屬於 Content-Encoding 回應標頭的一部分。

解析度

  1. 參閱 Apigee 支援的支援編碼編碼清單
  2. 確保後端伺服器一律會傳送以下項目:
    • 只有支援的編碼做為要求中 Content-Encoding 標頭的值。
    • 採用 Apigee Edge 支援的格式回應酬載,並與 Content-Encoding 標頭指定的格式相符

支援的編碼

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

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

規格

Apigee 會依據下列 RFC 規範傳回 415 Unsupported Media Type 錯誤回應:

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

注意事項

請注意:

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

    這是因為這個錯誤會在訊息處理器的初期階段發生,然後才執行任何政策。

  • 如果從後端伺服器的回應標頭中傳遞不支援的編碼,導致 Apigee 傳回 415 錯誤,則後端伺服器中必須修正該錯誤,以免發生這項錯誤。請視情況與後端團隊合作,以修正這個問題。

如果仍需要 Apigee Edge 支援服務的任何協助,請參閱必須收集診斷資訊一文。

必須收集診斷資訊

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

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

  • 機構組織名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成用來重現 415 錯誤的 curl 指令
  • 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