Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9370

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

$
0
0

この度、業務で未経験の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
publicIActionResultIndex(){returnView();}

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

POSTでJSONを受け取る

HomeController.cs
[HttpPost]publicIActionResultIndex(RequestJsonrequest){returnView();}

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

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

JSONを格納するクラス

RequestJson.cs
namespacesample.Objects{[DataContract]publicclassRequestJson{[DataMember]publicstringname{get;set;}[DataMember]publicstringemail{get;set;}[DataMember]publicList<Favorite>favorites{get;set;}[DataContract]publicclassFavorite{[DataMember]publicstringname{get;set;}[DataMember]publicstringdetail{get;set;}}}}

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

JSONをレスポンスする

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

HomeController.cs
[HttpPost]publicIActionResultIndex(RequestJsonrequest){//レスポンス生成ResponseJsonresponse=newResponseJson();response.code=1;returnJson(response);}

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

レスポンスJSON用のクラス

ResponseJson.cs
namespacesample.Objects{[DataContract]publicclassResponseJson{[DataMember]publicintcode{get;set;}[DataMember]publicstringmessage{get;set;}}}

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

参考

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


Viewing all articles
Browse latest Browse all 9370

Latest Images

Trending Articles