この度、業務で未経験の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": "映画みます。"
}
]
}
##コントローラの雛形
public IActionResult Index()
{
return View();
}
テンプレートを選択するとコントローラクラスが出来上がっているので、以下の様に追記していきます。
##POSTでJSONを受け取る
[HttpPost]
public IActionResult Index(RequestJson request)
{
return View();
}
[HttpPost]
を書くと、「/コントローラ名/メソッド名」というURLにPOST通信でリクエストが来た時に動くメソッドになります。
そして、引数のRequestJson request
は自分で作ったクラスです。こうすると、DI的な機能なのでしょうか? .NETフレームワークが良い感じにJSONをこのクラスのメンバー変数に入れてくれます。よくわかってません。
他の言語でもいいので、何かしらのフレームワークを使った事がある人なら、なんとなく分かるのではないでしょうか。僕はSpring FrameworkやLaravelをちょっとかじっていたのですが、同じような感じですね。
##JSONを格納するクラス
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をレスポンスする
先ほどのメソッドに追記・変更
[HttpPost]
public IActionResult Index(RequestJson request)
{
//レスポンス生成
ResponseJson response = new ResponseJson();
response.code = 1;
return Json(response);
}
リクエストの受け取りと同じように、ResponseJson
というレスポンス用のクラスを定義して、それをJson
クラス(.NET標準で使えるクラスだと思われる)に入れてreturnするだけでJSON形式で返してくれました。ここら辺も他のフレームワークと同じ感じですね。
##レスポンスJSON用のクラス
namespace sample.Objects
{
[DataContract]
public class ResponseJson
{
[DataMember]
public int code { get; set; }
[DataMember]
public string message { get; set; }
}
}
ここでは書いていませんが、リクエスト時と同様に、定義してやれば配列やネスとしたオブジェクトもちゃんとJSON形式に変換してくれます。
#参考
色々と参考にさせて頂いたサイトがあるのですが、見過ぎて覚えていません。。
ほんの一部ではありますが列挙いたします。