web-dev-qa-db-ja.com

Content-Typeを介して異なるアプリケーションにリクエストをルーティングすることは可能ですか?

JSON APIを設計していますが、何らかのコンテンツネゴシエーションを使用してAPIをバージョン管理したいと思います。私は現在、これを行うために ベンダーMIMEタイプ を使用することを計画しています。

これはアプリケーションレベルで確実に実行できますが、HTTPサーバーレベルで実行するのが最善だと思います。これはApacheまたはnginxで可能ですか?

Content-Typeは次のようになります。application/vnd.vendorname-v1+jsonまたはおそらくパラメータを使用して:application/vnd.vendorname+json;v=1

4
Adam Lassek

この種の問題に対するNginxの慣用的なアプローチは、mapを介したものです。 StackOverflowでの私の答え を参照してください。

基本的に、mapセクションでhttpを定義します

map $any_variable $my_upstream {
  # Default value:
  default upstream1;

  # Exact match:
  application/vnd.vendorname+json;v=1 upstream2;

  # Regexp:
  ~^application.*vnd.vendorname-v1\+json upstream3;
}

1つのマップに完全一致と正規表現を混在させることができます。

次に、serverまたはlocationセクションで$my_upstreamを使用するだけです。

location / {
  proxy_pass http://$my_upstream$uri;
}

Nginxは、マップ変数を遅延的に評価します。これは、(リクエストごとに)1回だけ、使用しているときにのみ行われます。

6

承知しました; Apacheのmod_rewriteは少しのRewriteCondでこれを行うことができますが、私は少し錆びすぎて頭のてっぺんから例をあげることができません。ただし、nginxでは次のようになります(2つのアップストリームが定義されていると仮定します。1つはjsonapp用で、もう1つは...その他のものです)。

if ($content_type = application/vnd.vendorname-v1+json) {
    proxy_pass http://jsonapp/
    break;
}
proxy_pass http://otherstuff/
1
womble

私は他の人が提案したことに反対するつもりです。

HTTPサーバーからのJSONAPIのバージョン管理に依存するのは本当に悪い考えだと思います。 HTTPサーバーは、開発中のAPIについて何も知りません。これは、Linuxバージョンをカーネルソースに組み込むのではなく、テキストファイルで定義するようなものです。アップグレードがより複雑になります。

必要なのは、将来の設定ミスだけであり、複雑なセットアップについて知らなかった次の人にとっては、すべてが腹を立てる可能性があります。

何をしているのかよくわからなくても、スクリプト言語を使用して取得できるようにする方法が必要です(スクリプト言語を使用していますか、それともカスタムJSONレスポンダーですか?)。つまり、JavaScriptで使用できるグローバル変数のようなものです。または、リクエストに応じて、APIバージョンを取得するためのJSONリクエストを返します。または、常に応答の前にあるすべてのJSON応答で送信します。結局のところ、それは非常に小さなテキストです。

K.I.S.Sを使用するアプローチすれば、これを後悔することはありません。

0
Matt