查看 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 診斷錯誤:
- 登入 Apigee Edge 帳戶。
切換至您要調查問題的機構:
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 確認「Proxy」篩選器已設為「All」。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.UnsupportedEncoding
的儲存格,如下所示:錯誤程式碼
protocol.http.UnsupportedEncoding
的相關資訊顯示如下:按一下「查看記錄」 ,然後展開其中一個失敗的要求,並顯示
415
錯誤訊息:- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 錯誤來源:這表示
apigee
傳回錯誤 或target
。 - 「Fault Code」:應與
protocol.http.UnsupportedEncoding
相符。
- 錯誤來源:這表示
- 如果「Fault Source」為
apigee
,表示要求Content-Encoding
標頭包含不支援的編碼。 - 如果 Fault Source 為
target
,表示後端伺服器 回應的Content-Encoding
標頭包含不支援的編碼。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用
追蹤工作階段,然後執行下列任一操作:
- 等待
415 Unsupported Media Type
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫以重現問題
415 Unsupported Media Type
個錯誤。
- 等待
確認已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗的部分。
錯誤通常會在「要求已傳送至目標」後於流程中發生。 伺服器階段,如下所示:
記下追蹤記錄中的錯誤值。
上述追蹤記錄範例將錯誤顯示為
Unsupported Encoding "utf-8"
。開始時間 要求傳送至後端伺服器後,Apigee 會發生這個錯誤, 後端伺服器傳送回應標頭Content-Encoding
及其值 的"utf-8"
,而不是 支援的編碼。- 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
向下捲動至「Phase Details」中的「Error / Response Headers」部分 判斷調查結果 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.UnsupportedEncoding
和target
,表示 錯誤是因為"utf-8"
傳遞不支援的編碼值 ( 回應標頭Content-Encoding
。回應標頭 值 X-Apigee-fault-code protocol.http.UnsupportedEncoding
X-Apigee-fault-source target
- 檢查您是否使用
建立 Proxy 鏈結也就是說,如果目標伺服器/目標端點叫用其他端點
使用 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 比對中發現任何
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
原因:要求中有不支援的編碼
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 中所述監控或 NGINX 存取記錄 常見的診斷步驟。
- 如果錯誤代碼是
protocol.http.UnsupportedEncoding
和錯誤 來源的值為apigee
或MP
,表示 用戶端應用程式傳送的要求在要求標頭中加入不支援的編碼Content-Encoding
。 - 您可以判斷在 HTTP 要求中傳遞不支援的編碼值
選擇下列其中一種做法:
錯誤訊息
使用錯誤訊息:如果您可以存取 Apigee Edge 收到的完整錯誤訊息,可參閱 至
faultstring
。faultstring
包含不支援的值 寫出。錯誤訊息示例:
"faultstring":"Unsupported Encoding \"UTF-8\""
請注意,在上述錯誤訊息中,不支援的編碼值是
“UTF-8”
,如faultstring
中所示。“UTF-8”
不是 Apigee Edge 中支援的編碼,因此這個要求 失敗,並傳回415 Unsupported Media Type
錯誤,錯誤代碼如下:protocol.http.UnsupportedEncoding
。
實際要求
使用實際要求:- 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度:
- 如果您可以存取用戶端應用程式所提出實際要求,請進行
步驟如下:
- 判斷傳遞至要求標頭
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 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、追蹤工具或 NGINX 存取記錄 常見的診斷步驟。
- 如果 Fault Source 的值為
target
,則表示 則後端伺服器傳送的回應中含有不支援的編碼,Content-Encoding
標頭。 - 您可以判斷在 HTTP 回應中傳送不支援的編碼值,
透過下列其中一種方式載入後端伺服器:
錯誤訊息
使用錯誤訊息:如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱
faultstring
。faultstring
包含 不支援的編碼。錯誤訊息示例:
"faultstring":"Unsupported Encoding \"UTF-8\""
-
請注意,在上述錯誤訊息中,不支援的編碼值是
“UTF-8”
,如faultstring
中所示。由於
“UTF-8”
並非 Apigee Edge 中支援的編碼,因此這會 要求失敗,並傳回415 Unsupported Media Type
錯誤及錯誤代碼:protocol.http.UnsupportedEncoding
。
追蹤工具
使用 Trace:
解析度
- 請前往下列清單查看 Apigee 支援的編碼清單: 支援的編碼
- 確定後端伺服器一律傳送下列項目:
- 只有支援的編碼做為
要求中的
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
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄:
/opt/apigee/var/log/edge-message- processor/logs/system.log