3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】リクエストをJSONで受け取って、JSONをレスポンスする

Last updated at Posted at 2019-12-16

この度、業務で未経験のC#を使ってAPIを作る機会がありました。
色々調べながらの作業だったので、同じ様な境遇に合っている人に向けて、「自分の場合はこれでできたよ」っていう内容を書いておきます。少しでも解決の一助になればと思います。

#自分のスキル

  • VisualStudioってなに?
  • .NETってなに?
  • C#ってJavaみたいに書けるんでしょ?

っていうレベルの完全初心者です。なんとか作った今でもほとんど分かっていません。
間違っている箇所があれば修正しますので、ご指摘いただければ幸いです。

#環境

  • mac
  • Visual Studio Community 2019 for Mac
  • C#

#プロジェクトを作る

Visual Studioを立ち上げるとプロジェクトの雛形(テンプレート)を選択することになったので、「.NET Core > Webアプリケーション(モデル ビュー コントローラー)」を選びました。

image.png

3つ上にある「API」でもよかったのですが、作ったAPIをViewで表示したかったのでこれを選びました。

#リクエストで渡されてくるJSONをオブジェクトに格納する

#(例)リクエスで渡ってくるJSON

{
  "name": "なまえ たろう",
  "email":  "taro@example.com",
  "favorites": [
    {
      "name": "ランニング",
      "detail": "走ります。"
    },
    {
      "name": "movie",
      "detail": "映画みます。"
    }
  ]
}

##コントローラの雛形

HomeController.cs
        public IActionResult Index()
        {
            return View();
        }

テンプレートを選択するとコントローラクラスが出来上がっているので、以下の様に追記していきます。

##POSTでJSONを受け取る

HomeController.cs
        [HttpPost]
        public IActionResult Index(RequestJson request)
        {
            return View();
        }

[HttpPost]を書くと、「/コントローラ名/メソッド名」というURLにPOST通信でリクエストが来た時に動くメソッドになります。
そして、引数のRequestJson requestは自分で作ったクラスです。こうすると、DI的な機能なのでしょうか? .NETフレームワークが良い感じにJSONをこのクラスのメンバー変数に入れてくれます。よくわかってません。

他の言語でもいいので、何かしらのフレームワークを使った事がある人なら、なんとなく分かるのではないでしょうか。僕はSpring FrameworkやLaravelをちょっとかじっていたのですが、同じような感じですね。

##JSONを格納するクラス

RequestJson.cs
namespace sample.Objects
{
    [DataContract]
    public class RequestJson
    {
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public string email { get; set; }
        [DataMember]
        public List<Favorite> favorites { get; set; }


        [DataContract]
        public class Favorite
        {
            [DataMember]
            public string name { get; set; }
            [DataMember]
            public string detail { get; set; }
        }
    }
}

渡ってくるJSONの形式に合わせてクラスを作成します。
ちなみに、JSONと変数を完全に合わせなくてもエラーにはなりませんでした。
JSONにはあるけれど、クラスには定義していないものは無視されます。(当たり前ですが、変数を定義していないので取得できない)

#JSONをレスポンスする

先ほどのメソッドに追記・変更

HomeController.cs
        [HttpPost]
        public IActionResult Index(RequestJson request)
        {
                //レスポンス生成
                ResponseJson response = new ResponseJson();
                response.code = 1;

                return Json(response);
        }

リクエストの受け取りと同じように、ResponseJsonというレスポンス用のクラスを定義して、それをJsonクラス(.NET標準で使えるクラスだと思われる)に入れてreturnするだけでJSON形式で返してくれました。ここら辺も他のフレームワークと同じ感じですね。

##レスポンスJSON用のクラス

ResponseJson.cs
namespace sample.Objects
{
    [DataContract]
    public class ResponseJson
    {
        [DataMember]
        public int code { get; set; }
        [DataMember]
        public string message { get; set; }
    }
}

ここでは書いていませんが、リクエスト時と同様に、定義してやれば配列やネスとしたオブジェクトもちゃんとJSON形式に変換してくれます。

#参考
色々と参考にさせて頂いたサイトがあるのですが、見過ぎて覚えていません。。
ほんの一部ではありますが列挙いたします。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?