前回のブログでは、HTTP プロトコルと RestFul API の関係と、HTTP プロトコルの基本的な知識について簡単に紹介しましたが、今日は、この知識に基づいて、WEB API シナリオのアプリケーションについて説明します。次に、最初の WEB API インターフェイスを作成し、それを簡単に呼び出す方法を示します。
多くの人が混乱しています。WCF があるのに、なぜ WEB API が必要なのでしょうか? WEB API は WCF に置き換わりますか?
私の知る限り、WCF は RPC 実装のコレクションを提供しており、WCF の設計では SOA シナリオとさまざまな RPC の問題がより考慮されています。 RestFul API も RPC の一種であると言う人も多く、WCF にも RestFul の実装があります。多くの資料では、RPC と RestFul の間にスタイルの概念にいくつかの違いがあります。実際、この 2 つの違いはより主観的なものであり、これらが過度に絡み合っているのは、主に WCF におけるいくつかの問題に焦点を当てているからです。 , サポートされているプロトコルは多数あり、WS-* シリーズ プロトコルや、非常に高いパフォーマンスを備えた専用の通信プロトコルを提供するいくつかのより簡潔なプロトコルがあり、WCF はサービス ディスカバリやその他の機能も提供するため、内部用途には WCF の方が適していると思います。高パフォーマンスの呼び出しの場合、コミュニティには gRPC、Avor、thrift などの他の RPC ソリューションもあります。これらはすべて WCF と同じ位置付けの製品であり、WEB API は HTTP に焦点を当てた製品です。 RestFul スタイルをベースに、あらゆる言語、あらゆる端末に簡単に接続でき、開発、デバッグ、負荷分散、およびコンテンツ配信に非常に成熟したさまざまな HTTP インフラストラクチャとソリューションを利用できます。したがって、WEB API は、RestFul スタイルのオープン API の迅速な開発に焦点を当てた HTTP 用の開発フレームワークです。現時点では、WCF の代替にはならないようです。それぞれに適したシナリオがあり、WEB API は WCF の代替とは言えません。
さて、WEB API インターフェースの最初のセットを開発しましょう! VS2012 以降を使用するバージョンには、既製の WEB API 作成テンプレートが用意されており、それに従って作成するだけで、プロジェクト内に MVC プロジェクトと WEB API プロジェクトが存在し、WEB API は MVC に依存するため、個別に作成することはできません。 WEB API と MVC はどちらも同様のルーティング メカニズムを使用するため、デフォルト ルートでは、WEB API はルートとして
/api/{controller}/{id}
を使用し、MVC と Web API を区別するために /api/ セクションが追加されます。
次に、ApiController を継承する PersonController という名前の WEB API コントローラーを追加します。このコントローラーを作成するときに、リソース Person を定義し、PersonController 内のすべての操作はこのリソースを中心に展開されます。次に、追加、削除、変更、確認の一連の操作の定義を開始します。
Web API では、デフォルトのルーティングには規則が採用されています。ルーティングは述語に基づいており、メソッド名のプレフィックスはメソッドの呼び出しに使用される HTTP 述語です。コード例は次のとおりです。
/// <summary> /// Person 为资源,对Person进行的一组操作 /// </summary> public class PersonController : ApiController { private static List<Person> _personLst = new List<Person>(); /// <summary> /// 获取一个Person /// </summary> /// <param name="id">Person的ID</param> /// <returns>Person</returns> public Person GetPerson(long id) { return _personLst.Find(x => x.Id == id); } /// <summary> /// 添加一个Person /// </summary> /// <param name="person">Person</param> public void PostAddPerson(Person person) { _personLst.Add(person); } /// <summary> /// 修改一个 /// </summary> /// <param name="id">Person Id</param> /// <param name="person">新</param> public void PutModifyPerson(long id, Person person) { var p = _personLst.Find(x => x.Id == id); p.Age = person.Age; p.Name = person.Name; p.Sex = person.Sex; } /// <summary> /// 删除一个Person /// </summary> /// <param name="id">Person ID</param> public void DeletePerson(long id) { _personLst.RemoveAll(x => x.Id == id); } }
リソースの CRUD 操作のためのシンプルな API 入力を解析したり出力をステッチしたりする必要がなく、とてもシンプルです。お散歩しましょ♪!
リクエストを送信します: 述語は POST、セマンティクスは person を作成することであり、person は Body で記述され、Body は Json を通じてシリアル化されるように head で宣言されます。
受信した応答: 応答コード 204、2XX タイプに属し、実行は成功しました。Body にデータはありません
リクエストの送信: 述語は GET、セマンティクスは個人リソースをクエリすること、ID は 1、ヘッドはそれを希望することを宣言しますXML シリアル化されたデータを受信します
受信した応答: 応答コードは 200、実行は成功、Body にデータがあります、データは XML を使用してシリアル化されています
リクエストの送信: 述語は PUT、セマンティクスは Person を変更することですID 1 のリソース、Body のコンテンツを変更します。Body で、Name を Test1Changed に変更します。応答コードは 204 で、実行は成功しました。
リクエストを送信します: 述語は GET で、セマンティクスは ID 1 の Person リソースをクエリすることです。Accept は、Json データの受信を希望していることを示します
受信したレスポンス: Body が、次の方法でシリアル化されたコンテンツであることがわかります。 Json、Name 属性が Test1Changed に変更されました
リクエストの送信: 述語は DELETE、セマンティクスは ID 1 の Person リソースを削除することです
受信したレスポンス: レスポンス コード 204、実行成功
发送请求:谓词为GET,语义为查询ID为1的Person资源,Accept标明希望接收到Json数据
收到响应:响应码为200,执行成功,响应内容为null,资源已删除
这就是我用Fiddler来发送、调用的一组RestFul接口,大家可以看到,整个调用过程使用到了HTTP的语义,用到了谓词路由、内容协商。在增、删、改操作中,我都是使用void作为返回值,根据HTTP Code 判断,大家也可以自定义一些返回数据来做出更进一步的操作描述。
在写了这些API后,我们需要在程序中调用,我以C#为例写一组对这些接口调用的实现。在C#中,传统调用HTTP接口一般有两种办法: WebRequest/WebResponse组合的方法调用和WebClient类进行调用。第一种方法抽象程度较低,使用较为繁琐;而WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,在Web API发布的同时,.NET提供了两个程序集:System.Net.Http和System.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient。在.NET4.5中带有这两个程序集,而.NET4需要到Nuget里下载Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client这两个包才能使用这个类,更低的.NET版本就只能表示遗憾了只能用WebRequest/WebResponse或者WebClient来调用这些API了。
在使用中,System.Net.Http这个程序集提供了HttpClient类以及相关的HTTP调用,而System.Net.Http.Formatting提供了一些针对HttpClient的帮助扩展,更好地支持了内容协商、Content创建等功能。下面我就和大家一起写一下这个例子:
我们新建一个控制台程序:
代码如下:
public class Person { public long Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } public override string ToString() { return $"Id={Id} Name={Name} Age={Age} Sex={Sex}"; } } class Program { static void Main(string[] args) { var client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:22658/"); //基本的API URL client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //默认希望响应使用Json序列化 Run(client); Console.ReadLine(); } static async void Run(HttpClient client) { var result = await AddPerson(client); Console.WriteLine($"添加结果:{result}"); //添加结果:true var person = await GetPerson(client); Console.WriteLine($"查询结果:{person}"); //查询结果:Id=1 Name=test Age=10 Sex=F result = await PutPerson(client); Console.WriteLine($"更新结果:{result}"); //更新结果:true result = await DeletePerson(client); Console.WriteLine($"删除结果:{result}"); //删除结果:true } static async Task<bool> AddPerson(HttpClient client) { return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" }) //向Person发送POST请求,Body使用Json进行序列化 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX } static async Task<Person> GetPerson(HttpClient client) { return await await client.GetAsync("api/Person/1") //向Person发送GET请求 .ContinueWith(x => x.Result.Content.ReadAsAsync<Person>( //获取返回Body,并根据返回的Content-Type自动匹配格式化器反序列化Body new List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*这是Json的格式化器*/ ,new XmlMediaTypeFormatter()/*这是XML的格式化器*/})); } static async Task<bool> PutPerson(HttpClient client) { return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" }) //向Person发送PUT请求,Body使用Json进行序列化 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX } static async Task<bool> DeletePerson(HttpClient client) { return await client.DeleteAsync("api/Person/1") //向Person发送DELETE请求 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX } }
这就完成了这组API的调用,是不是非常简单方便?HTTPClient使用全异步的方法,并且他有良好的扩展性,我会在之后的博客中再聊这个问题。
OK,到此为止一组简单的Restful API和C#的调用客户端就完成了,但这只是开始,Web API是一个很强大的框架,他的扩展点非常丰富,这些扩展能为我们的开发提供很多的帮助,下一篇博文我将为大家带来WEB API中Filter的使用。
博文中如有不正确的地方欢迎大家指正。
以上がASP.NET WEB APIの適用シナリオの最初の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。