こんにちは、サイオステクノロジー武井です。今回は、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;
}
}
まとめ
今回は自分への備忘録のためだけにかきました。すみません(´・ω・`)

