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:
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
テキスト形式のデータを返すには、ContentResultおよびConttent補助方法を使用します.
2.書式設定プログラム
アプリケーションが標準のJSON以外のフォーマットをサポートしたいなら、project.jsonファイルにこれらの追加の依存項を追加してMVCを配置してサポートします.入出力のフォーマットは分離できます.入力フォーマットは、モデルを使用してバインディングされ、出力フォーマットは応答をフォーマットすることにより設定されます.
3.XML形式へのサポートを追加する
XML形式へのサポートを追加するには、先にインストールする必要があります. Microsoft.AspNetCore.Mvc.Formaters.XmlパッケージをConfigreServicesに配置します. Xml Serializer Formaters:
4.特定のフォーマットを強制する
ある操作制限応答フォーマットのためには、「Produces」フィルタが使用されます.[Produces]フィルタは、このコントローラまたはアクションに応答フォーマットを指定することができる.
削除しました HttpNontentOutput Formaterは、あるリターンタイプがモデルオブジェクトの動作に戻ってnullに戻ると、204 No Conttent応答に戻ります.JSON形式は、本体情報がnullの応答に単純に戻りますが、XML形式は、空のX si:nil=true属性のXML要素を返します.
5.応答フォーマットURLマッピング
クライアントは、要求された文字列またはパスにおいて、または特定のフォーマットのファイル拡張子(例えば、.xmlまたは.json)を使用することによって、APIによって使用されるルーティングに指定する必要があるURLに特定のフォーマットを要求することができる.
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類:
コンソールを作成し、順序を確認します.
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();
}
}