AS.NET Core Web API

19889 ワード

1.簡単に紹介する
AS.NET Core Web APIはASP.NET Core MVCの機能です.ASP.NET Core MVCはWeb APIへのサポートを含んでいます.複数のクライアントのHTTPサービスを構築することができます.AS.NET Core Web APIは.NET Core上でRESTfulアプリケーションを構築するために使用できます.
フレームワークにはHTTPコンテンツ協議のサポートが含まれており、JSONやXML形式のデータが内蔵されています.カスタムフォーマットを作成するには、独自のフォーマットに対するサポートが追加されています.
リンクを使ってハイパーメディアのサポートを生成します.複数のWebアプリケーション間で共有できるように、複数のリソース共有(CORS)へのサポートを有効にする.
例えば、APIの新規プロジェクトを作成します.デフォルトでは一つが含まれています. Values Controller:
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResultstring>> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
デフォルトではGET、POST、PUT、DELETEのいくつかのHTTP要求動作が含まれています.ここで直接特性ルートを使って、コントローラに明記します. [Route].調整してブラウザの入力を開きます. https://localhost:5000/api/values を選択すると、データが戻ります.
 
2.カスタムフォーマット(Format)
AS.NET Core MVC内には、フォームを修正したり、クライアントが指定するフォーマットを生成したりするために、対応するデータのフォーマットをサポートしています.
1.特定のフォーマットの操作結果
いくつかの操作結果のタイプは、Json ResultまたはContentResultなどの特定のフォーマットです.動作は、常にフォーマットが特定のフォーマットである具体的な結果を返します.たとえば戻る Jsons Resoultは、クライアントの要求に関わらず、JSONフォーマットのデータを返します.
動作は、特定のタイプのいずれかに戻る必要はありません.MVCは、戻り値として任意のオブジェクトをサポートします.操作がIAction Resoultのある実装であり、コントローラがControllerから継承される場合、より多くの補助方法が使用され得る.そうでなければ、適切なIOutput Formaterを使って、プログレッシブオブジェクトを実現します.
Controllerベースを継承したコントローラから特定のフォーマットのデータを返すには、内蔵の補助方法Jsonを使ってJSONフォーマットに戻り、Conttentを使ってテキストを返します.操作方法の戻りのタイプは、指定された結果のタイプ(例えば、JsonsResoult)または IAction Resoult
[HttpGet]
        public JsonResult Get()
        {
            return Json(new User());
        }
以上のコードはContent-Typeでaplication/jsonに戻ります.
テキスト形式のデータを返すには、ContentResultおよびConttent補助方法を使用します.
[HttpGet]
        public ContentResult Get()
        {
            return Content("result");
        }
以上のコードはConttentt-Typeに戻ります.  test/planこの挙動は、文字列の対応するタイプを使用してもよい.
[HttpGet]
        public string Get()
        {
            return "result";
        }
戻るタイプやオプションが複数ある複雑な操作については、選択してください. IAction Resoultは、リターンタイプとして機能します.
  
2.書式設定プログラム
アプリケーションが標準のJSON以外のフォーマットをサポートしたいなら、project.jsonファイルにこれらの追加の依存項を追加してMVCを配置してサポートします.入出力のフォーマットは分離できます.入力フォーマットは、モデルを使用してバインディングされ、出力フォーマットは応答をフォーマットすることにより設定されます.
 
3.XML形式へのサポートを追加する
XML形式へのサポートを追加するには、先にインストールする必要があります. Microsoft.AspNetCore.Mvc.Formaters.XmlパッケージをConfigreServicesに配置します. Xml Serializer Formaters:
services.AddMvc()
                .AddXmlSerializerFormatters()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
または出力フォーマットのみを追加できます.
services.AddMvc(options => {
                options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
            })
                //.AddXmlSerializerFormatters()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
この二つの方法は全部使います. System.Xml.Serialzation.Xml Serializerプログレッシブ結果.他の関連書式を追加することでも使用できます. System.Runtime.Serialzation.Data ContractSerializer:
            services.AddMvc(options => {
                options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
            })
                //.AddXmlSerializerFormatters()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
 
4.特定のフォーマットを強制する
ある操作制限応答フォーマットのためには、「Produces」フィルタが使用されます.[Produces]フィルタは、このコントローラまたはアクションに応答フォーマットを指定することができる.
[HttpGet("{id}", Name = "Get")]
        [Produces("application/json")]
        public string Get(int id)
        {
            return "value";
        }
いくつかの特殊な状況については、内装のフォーマットを使いたくないかもしれません.デフォルトでは、戻るタイプがstringの場合はtext/plinにフォーマットされます.このような挙動は除去により可能である. TextOutput Formaterは変更します.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options => {
                options.OutputFormatters.RemoveType();
                options.OutputFormatters.RemoveType();
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
上の移動はTextOutput Formaterと HttpNontentOutput Formaterは、戻るタイプがstringの場合、406 Not Acceptbleに戻ります.XMLフォーマットプログラムがあると、応答結果をフォーマットします.
削除しました HttpNontentOutput Formaterは、あるリターンタイプがモデルオブジェクトの動作に戻ってnullに戻ると、204 No Conttent応答に戻ります.JSON形式は、本体情報がnullの応答に単純に戻りますが、XML形式は、空のX si:nil=true属性のXML要素を返します.
 
5.応答フォーマットURLマッピング
クライアントは、要求された文字列またはパスにおいて、または特定のフォーマットのファイル拡張子(例えば、.xmlまたは.json)を使用することによって、APIによって使用されるルーティングに指定する必要があるURLに特定のフォーマットを要求することができる.
    [FormatFilter]
    public class UserController : Controller
    {
        // GET: api/User
        [HttpGet]
        [Route("[controller]/[action]/{id}.{format?}")]
        public IActionResult GetById(int id)
        {
            return Content("xxx");
        }
}
このルーティング構成は、オプションのファイル拡張を使用して名来でフォーマットを指定することができます.[FormatFilter]特性は、RouteDataでフォーマットの値が存在するかどうかを確認し、応答を作成する際に応答データを対応するフォーマットにマッピングします.
Route Formater
/User/GetById/5:標準出力フォーマット
/User/GetById/5.Json:JSONフォーマット(配置されている場合)
/User/GetById/5.xml;XML形式(設定済みの場合)
 
6.カスタムフォーマットプログラムProtocol Buffers(protobufと略称する)
Protocol Buffersは、軽量で効率的な構造データ記憶フォーマットであり、構造データのシリアル化、またはプログレッシブ化に利用できる.データストアまたはRPC(リモートプロセス呼び出しプロトコル)のデータ交換フォーマットに適しています.通信プロトコル、データストアなどの分野で使用できる言語は関係なく、プラットフォームは関係なく、拡張可能なプログレッシブ構造データフォーマットです.例えばプログラムを実行してプロトブンスフォーマットに戻ります.
APIプロジェクトを作成し、追加します. protobuf-netで引用します.
追加 Protobuf Formater類:
    public class ProtobufFormatter:OutputFormatter
    {
        public string ContentType { get; private set; }
        public ProtobufFormatter()
        {
            ContentType = "application/proto";
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/proto"));
        }

        public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            var response = context.HttpContext.Response;
            Serializer.Serialize(response.Body,context.Object);
            return Task.FromResult(0);
        }

    }
引き継ぐ Output Formater、そして実現します. WriteResonseBodAyncメソッドは、初期化時に値を割り当てます. ContentTypeとサポートMediaTypeを追加します.はい、 WriteResonseBodAync 方法の中でResonseを獲得して、protobuf-netのを呼び出します. Serializer.Serialize方法はObjectを出力内容に順列化します. protobufは、プログレッシブ時に順序を指定し、User類を追加して実現しなければならない. protobufエンティティ:
    [ProtoContract]
    public class User
    {
        [ProtoMember(1)]
        public int Id { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
        [ProtoMember(3)]
        public int Age { get; set; }
    }
クラスに追加が必要です. [ProtContract]特性は、フィールド上で必要です. ProtoMemberの特性と順序を指定します.そして変更 UserController:
    [Route("api/[controller]")]
    [ApiController]
    [FormatFilter]
    public class UserController : Controller
    {
        private IEnumerable users;
        public UserController()
        {
            users = new User[] {
                new User(){ Id=1,Name="Bob",Age = 20},
                new User(){ Id=2,Name="Tom",Age = 22}
            };
        }
        // GET: api/User
        [HttpGet]
        [Produces("application/proto")]
        public IEnumerable Get()
        {
            return users;
        }
}
変更 ConfigreServices:
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options => {
                options.OutputFormatters.Add(new ProtobufFormatter());
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
プログラムを実行すると、バイナリファイルが返されます.
コンソールを作成し、順序を確認します.
    class Program
    {
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            var stream = client.GetStreamAsync("https://localhost:44358/api/User").Result;
            var users = Serializer.Deserialize>(stream);
            foreach (var user in users)
            {
                Console.WriteLine($"Id:{user.Id} - Name:{user.Name} - Age:{user.Age}");
            }
            Console.ReadKey();
        }
    }