前回[ASP.NET Web API] Web API を使ってみたので作り方のメモで作成した Web API を .NET のプログラムから連携して使用する方法の覚書を記載してみます。Web API サービスをC#のコードから使用するサンプルを作成するにあたり参考にしたページを下記に記載します。
Calling a Web API From a .NET Client (C#)
http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
検証環境は次の通りです
- Visual Studio 2012 ASP.NET 4.5
- Windows Server 2012
1. Web API と連携するC#のコードを作成する
javascript ではなく .NETのプログラムからWeb API と連携するには HttpClient と HttpResponseMessage クラスを使用するのが簡単な方法になります。Web API をコンシュームするプロジェクトで、Json形式のデータからオブジェクトにデシリアライズするためのクラスの定義をします。今回はJsonUserという名前で下記のように定義しました。後はデータを取得して、オブジェクトに変換して読み取るだけです。
/// <summary> /// WebApiから返される Json 形式のデータ /// から生成するクラスの定義 /// </summary> internal class JsonUser { public int ID { get; set; } public string Name { get; set; } public string Email { get; set; } public string Telephone { get; set; } }
新しく Webフォームを作成して、下記のように Page_Load メソッド内で 作成した Web API にリクエストを行いデータを取得するサンプルプログラムを作成しました。サンプルプログラムでは HttpClient クラスを使用して Web API にリクエストを行い、 処理結果を ReadAsync メソッドを使用して JsonUser にデシリアライズしてオブジェクトのインスタンスを作成しています。サンプルコードではおまけとして PostAsJsonAsync を使用してデータを更新するサンプルコードも載せています。
public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri("http://localhost:7269/"); client.DefaultRequestHeaders.Accept.Clear(); // json ではなく xml で応答を受け取る場合は application/xml client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = client.GetAsync("api/user").Result; if (response.IsSuccessStatusCode) { var product = response.Content.ReadAsAsync<IEnumerable<JsonUser>>().Result; grdView1.DataSource = product; grdView1.DataBind(); } else { ErrorLabel1.Text = response.ReasonPhrase; } response.Dispose(); // ポストする場合 JsonUser newData = new JsonUser { ID = -1, Name = "New Data", Email = "hello@test.jp", Telephone = "111-222-333" }; response = client.PostAsJsonAsync("api/user", newData).Result; if (response.IsSuccessStatusCode) { Label1.Text = response.Headers.Location.ToString(); } else { ErrorLabel1.Text = response.ReasonPhrase; } response.Dispose(); } } }
クライアント用に作成したaspxファイルは特別なマークアップはありませんが、参考までに掲載しておきます。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApi.WebForm2" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView runat="server" ID="grdView1"></asp:GridView> <asp:Label runat="server" ID="Label1"></asp:Label> <asp:Label runat="server" ID="ErrorLabel1"></asp:Label> </div> </form> </body> </html>
実行例は次のようになります。
2.まとめ
説明は以上になります。誤り、指摘点などあればご連絡ください。サンプルではGet,Post メソッドを使用するサンプルを掲載しました。冒頭で紹介したURLにはGET, POST に加えて DELETE , PUT も含めたサンプルが掲載されています。
さんのコメント: さんのコメント: