415 媒体类型不受支持 - 编码不受支持

<ph type="x-smartling-placeholder"></ph> 您正在查看 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 不支持的媒体类型

<ph type="x-smartling-placeholder">

导致此错误的可能原因如下:

原因 说明 适用的问题排查说明
请求中使用的编码不受支持 请求标头 Content-Encoding 包含不受支持的编码 。 Edge 公有云和私有云用户
响应中使用的编码不受支持 后端服务器响应标头 Content-Encoding 包含的编码 不支持 Apigee Edge。 Edge 公有云和私有云用户

常见诊断步骤

您可以使用以下任一方法诊断错误:

API 监控

<ph type="x-smartling-placeholder">

如需使用 API Monitoring 诊断错误,请执行以下操作:

  1. <ph type="x-smartling-placeholder"></ph> 登录您的 Apigee Edge 账号
  2. 切换到您要调查该问题的组织:

    界面组织下拉菜单
  3. 导航至分析 >API 监控 >调查页面。
  4. 选择您观察到错误的具体时间范围。
  5. 确保将代理过滤器设置为全部
  6. 根据时间绘制错误代码
  7. 选择一个错误代码为 protocol.http.UnsupportedEncoding 的单元格,如下所示:

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

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

  10. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • Fault Source:此页面会显示错误由 apigee 返回 或 target
    • 错误代码:这应该与 protocol.http.UnsupportedEncoding 匹配。
  11. 如果错误来源apigee,则表示请求 Content-Encoding 标头中包含不受支持的编码。
  12. 如果故障来源为 target,则表示后端服务器 响应的 Content-Encoding 标头中包含不受支持的编码。

跟踪工具

<ph type="x-smartling-placeholder">

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

  1. 启用 跟踪会话以及以下任一事件: <ph type="x-smartling-placeholder">
      </ph>
    • 等待发生 415 Unsupported Media Type 错误,或者
    • 如果您可以重现问题,请进行 API 调用以重现问题 415 Unsupported Media Type 个错误。
  2. 确保已启用 Show all FlowInfos

    查看选项窗格,显示所有 flowinfo
  3. 选择其中一个失败请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,并找到失败的位置。
  5. 该错误通常在 Request sent to target 服务器阶段,如下所示:

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

    上面的示例跟踪记录将错误显示为 Unsupported Encoding "utf-8"。开始时间 错误是在请求发送到后端服务器后由 Apigee 引发的,它表示 后端服务器发送了响应标头 Content-Encoding 和值 (共 "utf-8"),该日期不是 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,表明 导致了此错误,原因是服务器传递了不受支持的编码值 "utf-8", 响应标头 Content-Encoding 中的后端服务器。

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

  10. 检查您使用的是否为 <ph type="x-smartling-placeholder"></ph> 代理链;也就是说,如果目标服务器/目标端点正在调用另一个 创建代理
    1. 如需确定这一点,请返回到请求已发送到目标服务器阶段。 点击 Show Curl

    2. 此时将打开 Curl for Request Sent to Target Server(请求发送到目标服务器)窗口,您可以从中执行以下操作: 确定目标服务器主机别名。
    3. 如果目标服务器主机别名指向虚拟主机别名,则该别名为代理。 链接。在这种情况下,您需要对链式代理重复上述所有步骤, 您可以确定导致 415 Unsupported Media Type 错误的实际原因。
    4. 如果目标服务器主机别名指向您的后端服务器,则表示 您的后端服务器将不受支持的编码传递给 Apigee。

Nginix 访问日志

<ph type="x-smartling-placeholder">

如需使用 NGINX 访问日志诊断错误,请执行以下操作:

  1. 如果您是私有云用户,则可以使用 NGINX 访问日志来确定 有关 HTTP 415 错误的关键信息。
  2. 查看 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    <ph type="x-smartling-placeholder">
  3. 在特定时间段内搜索任何 415 错误(如果问题发生) 过去)或 415 时是否仍失败的任何请求。
  4. 如果您确实在 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

原因:请求中包含不受支持的编码

诊断

  1. 确定使用 API 观察到的错误的错误代码错误来源 监控或 NGINX 访问日志(如中所述) 常见的诊断步骤
  2. 如果故障代码protocol.http.UnsupportedEncoding故障 Source 的值为 apigeeMP,则表示 客户端应用发送的请求标头中包含不受支持的编码 Content-Encoding
  3. 您可以确定作为 HTTP 请求的一部分传递的不受支持的编码的值 使用以下任一方法:

    错误消息

    使用错误消息: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您有权查看从 Apigee Edge 收到的完整错误消息,请参阅 发送到 faultstringfaultstring 包含不受支持的 结束编码。

      示例错误消息

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. 请注意,在上述错误消息中,不支持的编码的值是 “UTF-8”,如 faultstring 中所示。

      由于 “UTF-8” 在 Apigee Edge 中不是受支持的编码,因此此请求 失败,并显示 415 Unsupported Media Type 错误,错误代码: protocol.http.UnsupportedEncoding

    实际请求

    使用实际请求: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您无权访问客户端应用发出的实际请求,请前往 解决方法
    2. 如果您可以访问客户端应用发出的实际请求,则请执行 操作步骤: <ph type="x-smartling-placeholder">
        </ph>
      1. 确定传递给请求标头 Content-Encoding. 的值
      2. 如果传递给请求标头 Content-Encoding 的值不是 1 支持的编码中列出的值,则该值为 导致出现此错误的原因。

        示例请求

        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. 确保客户端应用始终发送以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 仅支持作为 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 访问日志,如 常见的诊断步骤
  2. 如果故障来源的值为 target,则表示 包含不受支持的编码, Content-Encoding 标头。
  3. 您可以从 使用以下方法之一访问后端服务器:

    错误消息

    使用错误消息: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅 faultstringfaultstring 包含 编码不受支持。

      示例错误消息:

      "faultstring":"Unsupported Encoding \"UTF-8\""
    2. 请注意,在上述错误消息中,不支持的编码的值是 “UTF-8”,如 faultstring 中所示。

      由于 “UTF-8” 在 Apigee Edge 中不是受支持的编码, 请求失败,出现 415 Unsupported Media Type 错误,错误代码为: protocol.http.UnsupportedEncoding

    跟踪工具

    使用 Trace: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您没有失败请求的跟踪记录,请前往 解决方法
    2. 如果您已捕获故障跟踪记录,则可以确定不支持的 编码作为 Content-Encoding 响应的一部分由后端服务器传递 标头,如跟踪记录工具中所述。

分辨率

  1. 请参阅 Apigee 支持的编码列表, 支持的编码
  2. 确保后端服务器始终发送以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 只有支持的编码作为 请求中的 Content-Encoding 标头
    • 面向 Apigee Edge 且采用受支持格式的响应载荷并与格式匹配 在 Content-Encoding 标头中指定

支持的编码

下表列出了 Apigee Edge 支持的编码格式:

标题 编码 说明
Content-Encoding gzip Unix gzip 格式
deflate 此格式使用 zlib 结构和 deflate 压缩算法。

规范

Apigee 根据415 Unsupported Media Type 以下 RFC 规范:

规范
<ph type="x-smartling-placeholder"></ph> RFC 7231,第 6.5.13 节:415 不支持的媒体类型

需要注意的要点

请注意以下几点:

  • 如果由于传入的编码不受支持导致 Apigee 返回 415 错误 Content-Encoding 标头作为 API 请求的一部分,然后执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    • 您将无法捕获此类请求的跟踪记录。
    • 您无法修改由 Apigee Edge,其中包含了 RaiseFault、AssignMessage 等政策。

    这是因为此错误出现在消息处理器的早期阶段, 政策。

  • 如果由于传递了不受支持的编码而导致 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