この度、業務で未経験のC#を使ってAPIを作る機会がありました。
色々調べながらの作業だったので、同じ様な境遇に合っている人に向けて、「自分の場合はこれでできたよ」っていう内容を書いておきます。少しでも解決の一助になればと思います。
自分のスキル
- VisualStudioってなに?
- .NETってなに?
- C#ってJavaみたいに書けるんでしょ?
っていうレベルの完全初心者です。なんとか作った今でもほとんど分かっていません。
間違っている箇所があれば修正しますので、ご指摘いただければ幸いです。
環境
- mac
- Visual Studio Community 2019 for Mac
- C#
プロジェクトを作る
Visual Studioを立ち上げるとプロジェクトの雛形(テンプレート)を選択することになったので、「.NET Core > Webアプリケーション(モデル ビュー コントローラー)」を選びました。
3つ上にある「API」でもよかったのですが、作ったAPIをViewで表示したかったのでこれを選びました。
リクエストで渡されてくるJSONをオブジェクトに格納する
(例)リクエスで渡ってくるJSON
{"name":"なまえ たろう","email":"taro@example.com","favorites":[{"name":"ランニング","detail":"走ります。"},{"name":"movie","detail":"映画みます。"}]}
コントローラの雛形
publicIActionResultIndex(){returnView();}
テンプレートを選択するとコントローラクラスが出来上がっているので、以下の様に追記していきます。
POSTでJSONを受け取る
[HttpPost]publicIActionResultIndex(RequestJsonrequest){returnView();}
[HttpPost]
を書くと、「/コントローラ名/メソッド名」というURLにPOST通信でリクエストが来た時に動くメソッドになります。
そして、引数のRequestJson request
は自分で作ったクラスです。こうすると、DI的な機能なのでしょうか? .NETフレームワークが良い感じにJSONをこのクラスのメンバー変数に入れてくれます。よくわかってません。
他の言語でもいいので、何かしらのフレームワークを使った事がある人なら、なんとなく分かるのではないでしょうか。僕はSpring FrameworkやLaravelをちょっとかじっていたのですが、同じような感じですね。
JSONを格納するクラス
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をレスポンスする
先ほどのメソッドに追記・変更
[HttpPost]publicIActionResultIndex(RequestJsonrequest){//レスポンス生成ResponseJsonresponse=newResponseJson();response.code=1;returnJson(response);}
リクエストの受け取りと同じように、ResponseJson
というレスポンス用のクラスを定義して、それをJson
クラス(.NET標準で使えるクラスだと思われる)に入れてreturnするだけでJSON形式で返してくれました。ここら辺も他のフレームワークと同じ感じですね。
レスポンスJSON用のクラス
namespacesample.Objects{[DataContract]publicclassResponseJson{[DataMember]publicintcode{get;set;}[DataMember]publicstringmessage{get;set;}}}
ここでは書いていませんが、リクエスト時と同様に、定義してやれば配列やネスとしたオブジェクトもちゃんとJSON形式に変換してくれます。
参考
色々と参考にさせて頂いたサイトがあるのですが、見過ぎて覚えていません。。
ほんの一部ではありますが列挙いたします。