C#でJSONのレスポンスを受け取るRest APIを書く方法

こんにちは、サイオステクノロジー武井です。今回は、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;
    }
}

まとめ

今回は自分への備忘録のためだけにかきました。すみません(´・ω・`)

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です