您正在查看 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 診斷錯誤:
- 登入 Apigee Edge 帳戶。
切換到要調查問題的機構:
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
- 確認「Proxy」篩選器已設為「全部」。
- 將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
protocol.http.UnsupportedEncoding
的儲存格,如下所示:錯誤代碼
protocol.http.UnsupportedEncoding
的資訊如下所示:按一下「查看記錄檔」 ,然後展開其中一個失敗且出現
415
錯誤的要求,以便查看詳細資訊:- 在「記錄檔」視窗中記下下列詳細資料:
- Fault Source (Fault 來源):這表示
apigee
或target
傳回錯誤。 - Fault Code (Fault Code):這應與
protocol.http.UnsupportedEncoding
相符。
- Fault Source (Fault 來源):這表示
- 如果「Fault Source」為
apigee
,表示要求在Content-Encoding
標頭中包含不支援的編碼。 - 如果錯誤來源是
target
,表示後端伺服器回應在Content-Encoding
標頭中包含不支援的編碼。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用
追蹤記錄工作階段,然後採取下列其中一種做法:
- 等待發生
415 Unsupported Media Type
錯誤,或 - 如果可以重現問題,請透過 API 呼叫來重現
415 Unsupported Media Type
錯誤。
- 等待發生
確認已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
您會在「傳送至目標伺服器的要求」階段之後的流程中找到這個錯誤,如下所示:
記下追蹤記錄中的錯誤值。
上述範例追蹤記錄顯示錯誤為
Unsupported Encoding "utf-8"
。由於 Apigee 在要求傳送至後端伺服器後會引發錯誤,因此表示後端伺服器傳送了回應標頭Content-Encoding
的值為"utf-8"
,但該值在 Apigee 中並非支援編碼。- 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
在「階段詳細資料」面板中向下捲動至「錯誤 / 回應標頭」部分,確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.UnsupportedEncoding
和target
,表示這項錯誤是因為後端伺服器在回應標頭Content-Encoding
中傳遞不支援的編碼值"utf-8"
。回應標頭 值 X-Apigee-fault-code protocol.http.UnsupportedEncoding
X-Apigee-fault-source target
- 請檢查您是否正在使用
Proxy 鏈結,也就是目標伺服器/目標端點是否在 Apigee 中叫用其他 Proxy。
如要判斷情況,請返回「已傳送至目標伺服器的要求」階段。按一下「顯示 Curl」。
- 系統會隨即開啟「Curl for Request Sent to Target Server」視窗,您可以在其中決定目標伺服器主機別名。
- 如果目標伺服器主機別名指向虛擬主機別名,就表示其為 Proxy 鏈結。在這種情況下,您必須針對鏈結 Proxy 重複上述所有步驟,直到找出實際導致
415 Unsupported Media Type
錯誤的原因為止。 - 如果目標伺服器主機別名指向後端伺服器,就表示您的後端伺服器正在將不支援的編碼傳送至 Apigee。
Nginix 存取記錄檔
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP
415
錯誤的相關重要資訊。 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋特定期間 (如果問題在過去) 期間的任何
415
錯誤,或是是否有任何要求仍失敗並顯示415
。 如果在 X-Apigee-fault-code 與
protocol.http.UnsupportedEncoding
的值相符時發現任何415
錯誤,請檢查 X-Apigee-fault-code 的值。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
原因:要求中有不支援的編碼
診斷
- 透過 API 監控或 NGINX 存取記錄檔,找出錯誤的「Fault Code」和「Fault Source」,詳情請參閱 常見診斷步驟。
- 如果「Fault Code」為
protocol.http.UnsupportedEncoding
,且「Fault Source」值為apigee
或MP
,表示用戶端應用程式傳送的要求在要求標頭Content-Encoding
中包含不支援的編碼。 - 您可以使用下列其中一種方法,判斷在 HTTP 要求中傳遞不支援的編碼值:
錯誤訊息
使用錯誤訊息:如果您可以存取 Apigee Edge 傳送的完整錯誤訊息,請參閱
faultstring
。faultstring
包含不支援的結束編碼值。錯誤訊息示例:
"faultstring":"Unsupported Encoding \"UTF-8\""
請注意,在上述錯誤訊息中,不支援的編碼值為
“UTF-8”
,如faultstring
所示。由於 Apigee Edge 不支援
“UTF-8”
,因此這項要求會失敗,並顯示415 Unsupported Media Type
錯誤並顯示錯誤代碼:protocol.http.UnsupportedEncoding
。
實際要求
使用實際要求:- 如果您無法存取用戶端應用程式發出的實際要求,請前往「Resolution」。
- 如果您可以存取用戶端應用程式傳送的實際要求,請執行下列步驟:
- 確定傳遞至要求標頭
Content-Encoding.
的值 - 如果傳遞至要求標頭
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
。
- 確定傳遞至要求標頭
解析度
- 參閱 Apigee 支援的支援編碼編碼清單。
- 確保用戶端應用程式一律會傳送以下項目:
- 在要求中,只有支援的編碼做為
Content-Encoding
標頭的值。 - Apigee Edge 以支援的格式要求酬載,與
Content-Encoding
標頭指定的格式相符
- 在要求中,只有支援的編碼做為
在上述範例中,要求酬載具有
gz
副檔名,表示內容必須是gzip
。如要解決這個問題,請以Content-Encoding: gzip
的形式傳送要求標頭,並以gzip
格式要求酬載:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
原因:回應不支援編碼
診斷
- 使用 API 監控、追蹤記錄工具或 NGINX 存取記錄檔,找出錯誤的「Fault Code」和「Fault Source」,詳情請參閱常見診斷步驟。
- 如果「Fault Source」的值為
target
,表示後端伺服器傳送的回應在Content-Encoding
標頭中包含不支援的編碼。 - 您可以使用下列其中一種方法,從後端伺服器將不支援的編碼做為 HTTP 回應的一部分傳遞:
錯誤訊息
使用錯誤訊息:如果您可以存取從 Apigee Edge 收到的完整錯誤訊息,請參閱
faultstring
。faultstring
包含不支援的編碼值。錯誤訊息示例:
"faultstring":"Unsupported Encoding \"UTF-8\""
-
請注意,在上述錯誤訊息中,不支援的編碼值為
“UTF-8”
,如faultstring
所示。由於 Apigee Edge 不支援
“UTF-8”
,因此這項要求會失敗,並發生415 Unsupported Media Type
錯誤並發生以下錯誤代碼:protocol.http.UnsupportedEncoding
。
追蹤工具
使用 Trace:- 如果沒有失敗要求的追蹤記錄,請前往「Resolution」。
- 如果您已擷取失敗的追蹤記錄,就可以按照追蹤記錄工具的說明,判斷後端伺服器傳遞的不支援編碼屬於
Content-Encoding
回應標頭的一部分。
解析度
- 參閱 Apigee 支援的支援編碼編碼清單
- 確保後端伺服器一律會傳送以下項目:
- 只有支援的編碼做為要求中
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
其中:系統會將 ORG、ENV 和 PORT# 替換為實際值。
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message- processor/logs/system.log