こんにちは、サイオステクノロジー武井です。今回は、C#でJSONのレスポンスを受け取るRest APIを書く方法についてです。100番煎じくらいかと思いますが、自分への備忘録のために書きます。
APIの仕様
APIの仕様を以下とします。
リクエスト
URL |
https://api.example.com?apiKey=hogehoge |
Method |
Post |
Content Type |
application/json |
Request Body |
{“question”: “ちょうしはどう?”} |
レスポンス
Response Body |
{“answer”: “(´・ω・`)”} |
ソースコード
先のAPIの仕様を実現するソースコードは以下のとおりです。
using System; using System.IO; using System.Net.Http; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.Text; namespace RestAPI { class Program { static async System.Threading.Tasks.Task Main(string[] args) { // Request Bodyに乗せるJSONを定義します。 var json = "{\"question\":\"ちょうしはどう?\"}"; // Response Bodyに含まれるJSONを格納するインスタンスを生成します。 var answer = new Answer(); using (var client = new HttpClient()) { // Request BodyのContent-Typeや文字コードを定義します。 var content = new StringContent(json, Encoding.UTF8, "application/json"); // 先ほど定義したリクエストの内容に従って、指定したURLにPostメソッドでリクエストします。 var httpsResponse = await client.PostAsync("https://api.example.com?apiKey=hogehoge", content); // サーバーからのレスポンスをテキスト形式で受け取ります。ここで返ってくるレスポンスは // {"answer": "(´・ω・`)"}というテキスト形式なので、ちょっと扱いにくいです。 var responseContent = await httpsResponse.Content.ReadAsStringAsync(); // 扱いにくいテキスト形式のJSONをオブジェクト(後に定義しているAnswerクラス)に変換します。 using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(responseContent))) { var ser = new DataContractJsonSerializer(answer.GetType()); answer = ser.ReadObject(ms) as Answer; } } // JSONの内容をコンソールに表示します。 Console.WriteLine(answer.answer); } } // {"answer": "(´・ω・`)"}というJSONをオブジェクトに変換するためのクラスです。 [DataContract] public class Answer { // JSONのフィールド名とプロパティ名は合わせなければいけません。 // {"answer": "(´・ω・`)"}のフィールド名はanswerなので、プロパティ名もanswerになります。 [DataMember] public string answer; } }
まとめ
今回は自分への備忘録のためだけにかきました。すみません(´・ω・`)