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

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

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

まとめ

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

アバター画像
About 武井 宜行 269 Articles
Microsoft MVP for Azure🌟「最新の技術を楽しくわかりやすく」をモットーにブログtech-lab.sios.jp)で情報を発信🎤得意分野はAzureによるクラウドネイティブな開発(Javaなど)💻「世界一わかりみの深いクラウドネイティブ on Azure」の動画を配信中📹 https://t.co/OMaJYb3pRN
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる