415 サポートされていないメディアタイプ - サポートされていないエンコード

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが、API 呼び出しへのレスポンスとして HTTP ステータス コード 415 Unsupported Media Type とエラーコード protocol.http.UnsupportedEncoding を受け取ります。

エラー メッセージ

クライアント アプリケーションが次のレスポンス コードを受け取ります。

HTTP/1.1 415 Unsupported Media Type

また、以下のようなエラー メッセージが表示される場合もあります。

{
   "fault":{
      "faultstring":"Unsupported Encoding \"UTF-8\"",
      "detail":{
         "errorcode":"protocol.http.UnsupportedEncoding"
      }
   }
}

考えられる原因

このエラーは、クライアントが Apigee に送信された HTTP リクエストまたはバックエンド サーバーから Apigee に送信された HTTP レスポンスで指定された Content-Encoding ヘッダーの値に、仕様 RFC 7231、セクション 6.5.13: 415 Unsupported Media Type に従い、Apigee によってサポートされているエンコードが含まれていない場合に発生します。

このエラーには、次のような原因が考えられます。

原因 説明 トラブルシューティングの実施対象
サポートされていないエンコードがリクエストで使用されている リクエスト ヘッダー Content-Encoding に、Apigee Edge でサポートされていないエンコードが含まれています。 Edge Public Cloud ユーザーと Private Cloud ユーザー
サポートされていないエンコードがレスポンスで使用されています バックエンド サーバーのレスポンス ヘッダー Content-Encoding に、Apigee Edge でサポートされていないエンコードが含まれています。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

エラーを診断するには、次のいずれかの方法を使用します。

API Monitoring

API Monitoring を使用してエラーを診断するには:

  1. Apigee Edge アカウントにログインします。
  2. 問題を調査する組織に切り替えます。

    UI 組織のプルダウン
  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [プロキシ] フィルタが [すべて] に設定されていることを確認します。
  6. [Time] に [Fault Code] をプロットします。
  7. 以下に示すように、障害コード protocol.http.UnsupportedEncoding のセルを選択します。

    障害コードセルを選択しました
  8. 障害コード protocol.http.UnsupportedEncoding に関する情報が次のように表示されます。

  9. [ログを表示 ] をクリックし、415 エラーで失敗したリクエストの 1 つを開いて、詳細を表示します。

  10. [ログ] ウィンドウで、次の詳細をメモします。
    • Fault Source: apigee または target によってエラーが返されたことが表示されます。
    • 障害コード: protocol.http.UnsupportedEncoding と一致する必要があります。
  11. Fault Sourceapigee の場合は、リクエストの Content-Encoding ヘッダーにサポートされていないエンコードが含まれていることを示します。
  12. Fault Source が target の場合は、バックエンド サーバー レスポンスの Content-Encoding ヘッダーにサポートされていないエンコードが含まれていたことを示します。

Trace ツール

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションを有効にして、次のいずれかを行います。
    • 415 Unsupported Media Type エラーが発生するまで待ちます。
    • 問題を再現できる場合は、API 呼び出しを行って 415 Unsupported Media Type エラーを再現します。
  2. [Show all FlowInfos] が有効になっていることを確認します。

    [表示オプション] ペイン、すべての Flowinfo を表示
  3. 失敗したリクエストの 1 つを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを順に確認し、エラーが発生した場所を見つけます。
  5. このエラーは通常、以下に示すように「Request sent to target server」フェーズ後のフローで発生します。

  6. トレースでのエラーの値をメモします。

    上のサンプル トレースでは、エラーが Unsupported Encoding "utf-8" となっています。このエラーは、バックエンド サーバーにリクエストが送信された後に Apigee によって発生したため、バックエンド サーバーが "utf-8" の値を含むレスポンス ヘッダー Content-Encoding を送信したことを示します。これは、Apigee でサポートされているエンコードではありません。

  7. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
  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. これを確認するには、[Request sent to target server] フェーズに戻ります。[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. X-Apigee-fault-code protocol.http.UnsupportedEncoding の値と一致する 415 エラーが見つかった場合は、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 の値が target の場合もあります。X-Apigee-fault-source X-Apigee-fault-source X-Apigee-fault-source

原因: リクエストでサポートされていないエンコード

診断

  1. 一般的な診断手順で説明されているように、API Monitoring または NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースを特定します。
  2. [Fault Code] が protocol.http.UnsupportedEncoding で、[Fault Source] の値が apigee または MP の場合、クライアント アプリケーションから送信されたリクエストのリクエスト ヘッダー Content-Encoding に、サポートされていないエンコードが含まれていることを示します。
  3. HTTP リクエストの一部として渡される、サポートされていないエンコードの値は、次のいずれかの方法で確認できます。

    エラー メッセージ

    該当するエラー メッセージの場合:
    1. Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、faultstring を参照してください。faultstring には、サポートされていない終了コードの値が含まれます。

      エラー メッセージの例:

      "faultstring":"Unsupported Encoding \"UTF-8\""
      
    2. 上記のエラー メッセージで、サポートされていないエンコードの値は faultstring にある “UTF-8” です。

      “UTF-8” は Apigee Edge でサポートされていないエンコードであるため、このリクエストは 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 Monitoring、Trace Tool、または NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースを特定します。
  2. [Fault Source] の値が target の場合、バックエンド サーバーから送信されたレスポンスの Content-Encoding ヘッダーに、サポートされていないエンコードが含まれていることを示します。
  3. バックエンド サーバーから HTTP レスポンスの一部として渡される、サポートされていないエンコードの値は、次のいずれかの方法で確認できます。

    エラー メッセージ

    該当するエラー メッセージの場合:
    1. Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、faultstring を参照してください。faultstring には、サポートされていないエンコードの値が含まれます。

      エラー メッセージの例:

      "faultstring":"Unsupported Encoding \"UTF-8\""
      
    2. 上記のエラー メッセージで、サポートされていないエンコードの値は faultstring にある “UTF-8” です。

      “UTF-8” は Apigee Edge でサポートされていないエンコードであるため、このリクエストは 415 Unsupported Media Type エラーで失敗します(エラーコード: protocol.http.UnsupportedEncoding)。

    Trace ツール

    Trace の使用:
    1. 失敗したリクエストのトレースがない場合は、解決策に進みます。
    2. 障害のトレースをキャプチャしたら、Trace ツールで説明されているように、バックエンド サーバーから渡されたサポートされていないエンコードを Content-Encoding レスポンス ヘッダーの一部として確認できます。

解像度

  1. サポートされているエンコードで、Apigee でサポートされているエンコードのリストをご覧ください。
  2. バックエンド サーバーが常に以下を送信することを確認します。
    • リクエストの Content-Encoding ヘッダーの値として、サポートされているエンコードのみ
    • Apigee Edge に対してサポートされている形式で、Content-Encoding ヘッダーで指定された形式のレスポンス ペイロード

サポートされているエンコード

次の表に、Apigee Edge でサポートされているエンコード形式を示します。

ヘッダー エンコード 説明
Content-Encoding gzip Unix gzip 形式
deflate この形式では、zlib 構造とデフレート圧縮アルゴリズムを使用します。

仕様

Apigee は、次の RFC 仕様に従って 415 Unsupported Media Type エラー レスポンスを返します。

仕様
RFC 7231、section 6.5.13: 415 Unsupported Media Type

重要なポイント

次の点に注意してください。

  • API リクエストの一部として Content-Encoding ヘッダーでサポートされていないエンコードが渡されたため、Apigee から 415 エラーが返された場合:
    • このようなリクエストのトレースはキャプチャできません。
    • RaiseFault、AssignMessage などのポリシーを使用して、Apigee Edge によって送信されるエラー レスポンスの形式や内容を変更することはできません。

    このエラーは、ポリシーの実行前に Message Processor の初期段階で発生するためです。

  • バックエンド サーバーからレスポンス ヘッダーで渡されるサポートされていないエンコードが原因で Apigee から 415 エラーが返された場合、このエラーを回避するにはバックエンド サーバーで修正する必要があります。必要に応じてバックエンド チームと連携して、この問題を修正してください。

Apigee Edge サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

Apigee サポートのサポートが必要な場合は、次の診断情報を収集して、Apigee Edge サポートに連絡してください。

Public Cloud ユーザーの場合は、次の情報を入力します。

  • 組織の名前
  • 環境名
  • API プロキシ名
  • 415 エラーを再現するための完全な curl コマンド
  • API リクエストのトレース ファイル

Private Cloud ユーザーの場合は、次の情報を入力します。

  • 失敗したリクエストについて確認された完全なエラー メッセージ
  • 環境名
  • API プロキシ バンドル
  • API リクエストのトレース ファイル
  • NGINX アクセスログ /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ここでORGENVPORT# は実際の値に置き換えられます。

  • Message Processor のシステムログ /opt/apigee/var/log/edge-message- processor/logs/system.log