2016-09-13 12 views
0

AWS API Gatewayでコンテンツネゴシエーションを使用して、いくつかのデータを取得する2つの手段を提供するAPIを設定しました。AWS APIゲートウェイボディマップワイルドカード

私の問題は、default Content-Type header appears to be application/jsonのため、以下のマークアップの例がapplication/jsonとして返され、レンダリングされずに表示されているということです。

ボディマッピングテンプレートtext/htmlは、ブラウザによって送信されたAcceptヘッダーで完全一致を試行します。たとえば、Chromeは

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 

です。明らかに!== text/htmlです。つまり、上記のようなリクエストを送信すると、正しい応答が表示されますが、間違ったコンテンツタイプのヘッダーが表示されます。

私のオプションは

  1. ワイルドカードや正規表現の仕事をするために手段を検索text/html
  2. にデフォルトを設定するいくつかの方法を探すように思われます。例えば。 text/*

私は上記を役に立たなかったが、私は何かが欠けていると思っている。


  • 一つは、JSON(Accept: application/json

    { 
        "id": "d4ef7d3f-f2..." 
    } 
    
  • 別で応答レスポンス例はpostMessageを送信マークアップと、いくつかのJSです。コンテンツネゴシエーションのためのAPIゲートウェイ闊歩

    Accept: text/html

    <!DOCTYPE html> 
    <html lang="en"> 
        <head> 
        <meta charset="UTF-8"> 
        <title>Example</title> 
        </head> 
        <body> 
        <script> 
         parent.postMessage({"id": "d4ef7d3f-f2..."}, "...", window); 
        </script> 
        </body> 
    </html> 
    

骨子

https://gist.github.com/benswinburne/3a212c936e1d97fe8e17352269d6edb6

答えて

1

API Gatewayのサポートは現在制限されています。

APIゲートウェイでコンテンツを直接配信する代わりに、シンクライアントレイヤを使用してAPIゲートウェイへの呼び出しを制御することをお勧めします。これにより、とりわけAccept/Content-Typeヘッダーを完全に制御することができます。

例として、一般的にS3サイトでホストされている単純なSPAと、APIゲートウェイを呼び出すjavascriptクライアントがあります。

また、メソッドレスポンスのContent-Typeヘッダーの既定のマッピングをオーバーライドすることもできます。

この回答に基づいて実装した方法を説明するために編集します。

  1. 方法応答を追加Content-Type
  2. Content-Type => integration.response.body.contentType 
    
  3. 統合レスポンスヘッダマッピング

    を追加ヘッダのparamは、あなたがしているすべてのコンテンツタイプのための統合要求にボディマッピングテンプレートにマッピングされていることを確認しますを使用して。

  4. 更新ラムダ関数を例につき

exports.handler = (event, context, callback) => { 
    var contentType = this.negotiateContentType(event.params.header.Accept); 

    // abridged 

    context.done(null, {contentType}); // abridged 
}; 

exports.negotiateContentType = (header) => { 
    var contentType = 'text/html'; 

    if (header.match(/json/ig)) { 
     contentType = 'application/json'; 
    } 

    return contentType; 
} 

の下に、コンテンツタイプのプロパティを返すために、あなたの応答にコンテンツタイプをしたくない場合は、あなたが設定することができます統合応答のコンテンツタイプごとにボディマッピングテンプレートを作成します。

// All properties 
$input.json('$') 

// Custom output 
{ 
    "myproperty": $input.json('$.myproperty') 
} 
+0

おかげでライアン例えば

- あなたの最後の文は私が完全に私はそれが他の人のために働くようになった方法を説明するためにあなたの答えに追加したその上にアイデアを与えました。残念なことに、SPAをプロキシとして使用すると、302のリダイレクトと同じドメイン上にある必要がある実際のコンテンツが存在するため、私のニーズに合わないでしょう。プロキシは、コンテンツを読み込んだ後にブラウザをリダイレクトし、JSまたはメタリフレッシュでリクエストをプロキシ処理すると遅すぎることを意味します。さらに、別のURLを使ってリダイレクトしない限り、そのアプローチではCookieを削除することは問題になります。 –

関連する問題