您正在查看的是 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" } } }
可能的原因
根据
RFC 7231 第 6.5.13 节:415 不支持的媒体类型规范,如果客户端发送给 Apigee 的 HTTP 请求中指定的 Content-Encoding
标头值或后端服务器发送给 Apigee 的 HTTP 响应中指定的 Content-Encoding
标头值不包含 Apigee 的编码支持。
导致此错误的可能原因如下:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
请求中使用的编码不受支持 | 请求标头 Content-Encoding 包含 Apigee Edge 不支持的编码。 |
Edge 公有云和私有云用户 |
响应中使用的编码不受支持 | 后端服务器响应标头 Content-Encoding 包含 Apigee Edge 不支持的编码。 |
Edge 公有云和私有云用户 |
常见诊断步骤
您可以使用以下任一方法诊断错误:
API 监控
要使用 API Monitoring 诊断错误,请执行以下操作:
- 登录您的 Apigee Edge 帐号。
切换到您要调查问题的组织:
- 前往 Analyze > API Monitoring > Investigate 页面。
- 选择您发现错误的具体时间范围。
- 确保将代理过滤器设置为全部。
- 根据时间绘制故障代码。
选择包含错误代码
protocol.http.UnsupportedEncoding
的单元格,如下所示:错误代码
protocol.http.UnsupportedEncoding
的相关信息如下所示:点击查看日志 ,然后展开其中一个因
415
错误而失败的请求,以查看更多信息:- 在日志窗口中,请注意以下详细信息:
- Fault Source:显示错误是由
apigee
或target
返回的。 - Fault Code:这应与
protocol.http.UnsupportedEncoding
匹配。
- Fault Source:显示错误是由
- 如果 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 在请求发送到后端服务器后会引发此错误,因此表示后端服务器发送了值为"utf-8"
的响应标头Content-Encoding
,这不是 Apigee 支持的编码。- 进入跟踪记录中的 AX(已记录 Google 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
,这表明导致此错误的原因在于后端服务器在响应标头Content-Encoding
中传递了不受支持的编码值"utf-8"
。响应标头 值 X-Apigee-fault-code protocol.http.UnsupportedEncoding
X-Apigee-fault-source target
- 检查您是否在使用
代理链接;也就是说,目标服务器/目标端点是否正在调用 Apigee 中的另一个代理。
如需确定这一点,请导航回请求发送到目标服务器阶段。点击 Show Curl。
- 此时将打开 Curl for Request Sent to Target Server 窗口,您可以从中确定目标服务器主机别名。
- 如果目标服务器主机别名指向虚拟主机别名,则它是代理链。在这种情况下,您需要对链式代理重复上述所有步骤,直到确定导致
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
。 如果您确实发现任何
415
错误且 X-Apigee-fault-code 与protocol.http.UnsupportedEncoding
的值匹配,请确定 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 Monitoring 或 NGINX 访问日志确定观察到的错误的故障代码和故障来源。
- 如果故障代码为
protocol.http.UnsupportedEncoding
且故障来源的值为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
。
实际请求
使用实际请求:- 如果您无法访问客户端应用发出的实际请求,请转到解决。
- 如果您有权访问客户端应用发出的实际请求,请执行以下步骤:
- 确定传递给请求标头
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 监控、Trace Tool 或 NGINX 访问日志确定观察到的错误的故障代码和故障来源。
- 如果故障来源的值为
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:
分辨率
- 请参阅支持的编码中 Apigee 支持的编码列表
- 确保后端服务器始终发送以下内容:
- 仅包含支持的编码作为请求中
Content-Encoding
标头的值 - 响应载荷以支持的格式发送到 Apigee Edge,并与
Content-Encoding
标头中指定的格式匹配
- 仅包含支持的编码作为请求中
支持的编码
下表列出了 Apigee Edge 支持的编码格式:
标题 | 编码 | 说明 |
---|---|---|
Content-Encoding |
gzip |
Unix gzip 格式 |
deflate |
此格式搭配使用 zlib 结构和 deflate 压缩算法。 |
规范
Apigee 根据以下 RFC 规范返回 415 Unsupported Media Type
错误响应:
规范 |
---|
RFC 7231,第 6.5.13 节:415 不支持的媒体类型 |
需要注意的要点
请注意以下几点:
- 如果 Apigee 因 API 请求中传入的
Content-Encoding
标头不受支持编码而返回415
错误,则:- 您将无法捕获此类请求的跟踪记录。
-
您将无法使用 RaiseFault、AssignmentMessage 等政策修改 Apigee Edge 发送的错误响应的格式或内容。
这是因为此错误发生在消息处理器的早期阶段,在可以执行任何政策之前。
- 如果 Apigee 因从后端服务器传入的响应标头不受支持编码而返回
415
错误,则必须在后端服务器中修复此错误以避免此错误。请根据需要与您的后端团队合作解决此问题。
如果您仍然需要 Apigee Edge 支持团队的任何帮助,请参阅必须收集诊断信息。
必须收集的诊断信息
如果您仍然需要 Apigee 支持团队的任何帮助,请收集以下诊断信息,然后联系 Apigee Edge 支持团队:
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成用于重现
415
错误的curl
命令 - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 环境名称
- API 代理软件包
- 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