きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

ASP.NET Core WebAPI × FromBody × POSTリクエストのBody情報の取得

この記事の目的

この記事では、
ASP.NET Web APIで、POSTリクエストのBodyに格納されたJson情報を取得すること
を目的としています。


本題

★プロジェクトの作成

いつもの通り、サクッとプロジェクトを作成します。APIを実行するのを楽にするため、HTTPSサポートは外して作成しています。

f:id:kinakomotitti:20181211232400p:plain
プロジェクトの作成その1

f:id:kinakomotitti:20181211232439p:plain
プロジェクトの作成その2


★実装の確認

プロジェクトの作成が完了すると、いくつかのWeb APIが実装されたValuesコントローラーが生成されます。今回の舞台は、POSTメソッドなので、POSTメソッドの処理に注目します。

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

Bodyから受け取ったパラメータをString型のValue変数に格納して、メソッド内の処理に受け渡すという感じの実装が見て取れます。


★うまく取得できない例

では、さっそく、ここにJSON形式のデータを送り込んでみようと思います。

f:id:kinakomotitti:20181211233615p:plain
送り込んだデータと、その結果

Jsonはこんな感じです。

{
	"Root":{
	"key1": "value",
	"key2": 999	
	}
}


何やらエラーメッセージが返ってきました。これは、おそらく、Stringを待ち受けたけど、パースできない文字列({←これ)が来たことによるエラーです。

"Unexpected character encountered while parsing value: {. Path '', line 1, position 1."


★うまく取得できる例

うまくJsonの値を受けとるためには、あらかじめ、Jsonと同じ構造のクラスを用意する必要があります。今回の例の場合、Rootの子要素として、Key1とKey2があります。この親子関係を表現するクラスを用意し、そのクラスの型で引数を定義すればよいらしいです。
ということで、Jsonと同じ構造を持つクラスを作成する必要がありますが、一つ一つ作っていくのは結構面倒くさいです。そんな時には、便利なVisual Studioの機能や、QuicktypeというOSSを活用して楽をしようと思います。
www.kinakomotitti.net

今回は、Visual Studioの機能でサクッと作成してみました。作成したクラスは、以下のようになります。

        public class Rootobject
        {
            public Root Root { get; set; }
        }

        public class Root
        {
            public string key1 { get; set; }
            public int key2 { get; set; }
        }


このクラスを使って、Postメソッドを書き換えてみます。

        // POST api/values
        [HttpPost]
        public void Post([FromBody] Rootobject value)
        {
        }

修正ができたので、もう一度、同じリクエストを送信してみます。そして、正しく値が受け取れているかをデバッグで確認します。

f:id:kinakomotitti:20181211235119p:plain
確認

受け取れてそうですね!


まとめ

BodyのJson情報を受け取るには、FromBodyで指定した引数の型をJsonの構造に合わせたクラスにする!

参考

Web APIの参考にUiPathのOrchestratorを使ってます!
Swagger UI