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"
      }
   }
}

可能的原因

根据 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 诊断错误,请执行以下操作:

  1. 登录您的 Apigee Edge 帐号
  2. 切换到您要调查问题的组织:

    界面组织下拉菜单
  3. 前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您发现错误的具体时间范围。
  5. 确保将代理过滤器设置为全部
  6. 根据时间绘制故障代码
  7. 选择包含错误代码 protocol.http.UnsupportedEncoding 的单元格,如下所示:

    已选择故障代码单元格
  8. 错误代码 protocol.http.UnsupportedEncoding 的相关信息如下所示:

  9. 点击查看日志 ,然后展开其中一个因 415 错误而失败的请求,以查看更多信息:

  10. 日志窗口中,请注意以下详细信息:
    • Fault Source:显示错误是由 apigeetarget 返回的。
    • Fault Code:这应与 protocol.http.UnsupportedEncoding 匹配。
  11. 如果 Fault Sourceapigee,则表示请求 Content-Encoding 标头中包含不受支持的编码。
  12. 如果故障来源为 target,则表示后端服务器响应的 Content-Encoding 标头中包含不受支持的编码。

跟踪工具

如需使用跟踪工具诊断错误,请执行以下操作:

  1. 启用 跟踪会话,并执行以下任一操作:
    • 等待 415 Unsupported Media Type 错误发生,或者
    • 如果您可以重现问题,请进行 API 调用以重现 415 Unsupported Media Type 错误。
  2. 确保已启用 Show all FlowInfos

    视图选项窗格,显示所有 flowinfo
  3. 选择其中一个失败的请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,并找到失败的位置。
  5. 通常情况下,您会在请求发送到目标服务器阶段之后的流程中发现此错误,如下所示:

  6. 记下跟踪记录中的错误值。

    上面的示例轨迹将错误显示为 Unsupported Encoding "utf-8"。由于 Apigee 在请求发送到后端服务器后会引发此错误,因此表示后端服务器发送了值为 "utf-8" 的响应标头 Content-Encoding,这不是 Apigee 支持的编码

  7. 进入跟踪记录中的 AX(已记录 Google 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,这表明导致此错误的原因在于后端服务器在响应标头 Content-Encoding 中传递了不受支持的编码值 "utf-8"

    响应标头
    X-Apigee-fault-code protocol.http.UnsupportedEncoding
    X-Apigee-fault-source target

  10. 检查您是否在使用 代理链接;也就是说,目标服务器/目标端点是否正在调用 Apigee 中的另一个代理。
    1. 如需确定这一点,请导航回请求发送到目标服务器阶段。点击 Show Curl

    2. 此时将打开 Curl for Request Sent to Target Server 窗口,您可以从中确定目标服务器主机别名。
    3. 如果目标服务器主机别名指向虚拟主机别名,则它是代理链。在这种情况下,您需要对链式代理重复上述所有步骤,直到确定导致 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. 如果您确实发现任何 415 错误且 X-Apigee-fault-code protocol.http.UnsupportedEncoding 的值匹配,请确定 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 Monitoring 或 NGINX 访问日志确定观察到的错误的故障代码故障来源
  2. 如果故障代码protocol.http.UnsupportedEncoding故障来源的值为 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. 如果您无法访问客户端应用发出的实际请求,请转到解决
    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 监控、Trace Tool 或 NGINX 访问日志确定观察到的错误的故障代码故障来源
  2. 如果故障来源的值为 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. 如果您没有失败请求的跟踪记录,请转到解决
    2. 如果您捕获了失败跟踪记录,则可以确定后端服务器传递的不受支持的编码作为 Content-Encoding 响应标头的一部分,如跟踪工具中所述。

分辨率

  1. 请参阅支持的编码中 Apigee 支持的编码列表
  2. 确保后端服务器始终发送以下内容:
    • 仅包含支持的编码作为请求中 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

    其中:将 ORGENVPORT# 替换为实际值。

  • 消息处理器系统日志 /opt/apigee/var/log/edge-message- processor/logs/system.log