C#
 Computer >> コンピューター >  >> プログラミング >> C#

ASP.NET Web API(C#)のコンテンツネゴシエーションとは?仕組みと実装例を解説

コンテンツネゴシエーションとは

コンテンツネゴシエーション(Content Negotiation)とは、同じリソースに対して複数の表現形式が存在する場合に、その中から最適な表現を選択する仕組みのことです。具体的には、リクエストに含まれるAcceptヘッダーの値に応じて、サーバーがレスポンスの形式を決定します。

HTTPにおけるコンテンツネゴシエーションの主なメカニズムは、以下のリクエストヘッダーです。

  • Accept − レスポンスとして受け入れ可能なメディアタイプ。例:「application/json」「application/xml」、あるいは「application/vnd.example+xml」のようなカスタムメディアタイプ。
  • Accept-Charset − 受け入れ可能な文字セット。例:UTF-8 や ISO 8859-1。
  • Accept-Encoding − 受け入れ可能なコンテンツエンコーディング。例:gzip。
  • Accept-Language − 希望する自然言語。例:「en-us」(日本語の場合は「ja」)。

サーバーはHTTPリクエストの他の部分も参照できます。たとえば、AJAXリクエストを示す「X-Requested-With」ヘッダーがリクエストに含まれていて、Acceptヘッダーが指定されていない場合は、JSONをデフォルトのレスポンス形式として返す、といった動作が可能です。

Web APIパイプラインにおける処理の流れ

コンテンツネゴシエーションの実行時、パイプラインはHttpConfigurationオブジェクトからIContentNegotiatorサービスを取得します。同時に、HttpConfiguration.Formattersコレクションからメディアフォーマッターの一覧も取得します。

次に、パイプラインはIContentNegotiator.Negotiateメソッドを呼び出し、以下の3つの情報を渡します。

  • シリアライズ対象のオブジェクトの型
  • メディアフォーマッターのコレクション
  • HTTPリクエスト

Negotiateメソッドは、次の2つの情報を結果として返します。

  • 使用すべきフォーマッター
  • レスポンスのメディアタイプ

もし適切なフォーマッターが見つからなかった場合、Negotiateメソッドはnullを返し、クライアントにはHTTPステータス406(Not Acceptable)が返されます。

サンプルコード:StudentController

以下のようなStudentControllerを例に考えてみましょう。

using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace DemoWebApplication.Controllers
{
    public class StudentController : ApiController
    {
        List<Student> students = new List<Student>
        {
            new Student
            {
                Id = 1,
                Name = "Mark"
            },
            new Student
            {
                Id = 2,
                Name = "John"
            }
        };
    }
}

RESTfulサービスとAcceptヘッダー

RESTfulサービスの標準のひとつとして、「クライアントがレスポンスの形式(XML、JSONなど)を自分で決定できること」が挙げられます。サーバーに送信されるリクエストにはAcceptヘッダーが含まれており、クライアントはこのヘッダーを使って希望するレスポンス形式を指定できます。たとえば、以下のように使います。

Accept: application/xml → XML形式で返却
Accept: application/json → JSON形式で返却

下記の出力例は、Acceptヘッダーに application/XML を指定した場合で、レスポンスがXML形式になっていることを示しています。

ASP.NET Web API(C#)のコンテンツネゴシエーションとは?仕組みと実装例を解説

次の出力例は、Acceptヘッダーに application/JSON を指定した場合で、レスポンスがJSON形式になっていることを示しています。

ASP.NET Web API(C#)のコンテンツネゴシエーションとは?仕組みと実装例を解説

Content-Typeヘッダーの自動設定

リクエストされた形式でレスポンスがクライアントへ送信される際、レスポンスのContent-Typeヘッダーにも適切な値が自動的に設定されます。たとえば、クライアントが application/xml を要求した場合、サーバーはデータをXML形式で送信するとともに、Content-Type=application/xml を設定します。

ASP.NET Web API(C#)のコンテンツネゴシエーションとは?仕組みと実装例を解説

品質係数(q値)による優先順位の指定

Acceptヘッダーでは、品質係数(quality factor/q値)を使って各形式の優先度を指定することもできます。以下の例では、xmlのq値(0.8)がjsonのq値(0.5)よりも高いため、サーバーはXMLフォーマッターを選択し、データをXML形式で返します。

application/xml;q=0.8,application/json;q=0.5

ASP.NET Web API(C#)のコンテンツネゴシエーションとは?仕組みと実装例を解説

  1. C# ASP.NET Web APIのフィルターの種類と使い方を徹底解説

    ASP.NET Web APIフレームワークでは、リクエスト処理のさまざまな段階に追加のロジックを組み込むために「フィルター」が使用されます。フィルターは、ロギング、認可、キャッシュといった横断的関心事(クロスカッティングコンサーン)を実装するための仕組みであり、アクションメソッドやコントローラーに対して、宣言的またはプログラム的に適用できます。ここでは、C#のWeb APIで利用できる主なフィルターの種類について詳しく見ていきましょう。Web APIの主なフィルターの種類1. 認証フィルター(Authentication Filter)認証フィルターは、ユーザーの身元情報を検証するために使用

  2. C# ASP.NET Web APIにおけるコントローラーアクションの4つの戻り値の型とは?

    ASP.NET Web APIのアクションメソッドには、主に以下の4種類の戻り値の型を指定することができます。 void(戻り値なし) プリミティブ型/複合型 HttpResponseMessage IHttpActionResult 1. void(戻り値なし) すべてのアクションメソッドが必ずしも何かを返す必要はありません。戻り値の型としてvoidを指定することも可能です。 コード例 using DemoWebApplication.Models; using System.Web.Http; namespace DemoWebApplication.Controllers {