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;
    }
}

まとめ

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

アバター画像
About 武井 宜行 257 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.


*


質問はこちら 閉じる