web-dev-qa-db-ja.com

本体にint / string(単純型)を使用してasp.netコアWeb API2.1に投稿しても機能しません

郵便配達員からファイル->新しいプロジェクトで作成されたVanillaasp.netコア2.1WebAPIにURLエンコードされたフォーム値を送信することができません。私は何もしませんが、それでも新しいモデル検証機能が作動し、400 BadRequestを郵便配達員に返します。誰かが私が間違っていることを教えてもらえますか?

コントローラーの処置:

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

生のリクエスト(フィドラーで見られるように):

POST http://localhost:60843/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: a791eee7-63ff-4106-926f-2s67a8dcf37f
User-Agent: PostmanRuntime/7.3.0
Accept: */*
Host: localhost:60843
accept-encoding: gzip, deflate
content-length: 7
Connection: keep-alive

value=test

生の応答:

HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-SourceFiles: =?UTF-8?BQzpcUmVwb3NcVGVzdGJlZFxNb2RlbEJpbmRpbmdcTW9kZWxCaW5kaW5nXGFwaVx2YWx1ZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 25 Oct 2018 15:23:49 GMT

21
{"":["The input was not valid."]}
0

これは、Visual Studio2017のasp.netWebAPIのデフォルトテンプレートであることに再度注意してください。

興味深い事実は、Swashbuckleを追加してswagger uiエンドポイントに移動し、組み込みの「試してみる」機能を使用すると、すぐにエラーが発生することです。

これを複雑なタイプとjson本体で機能させることができましたが、単純なタイプを機能させることができず、さまざまな種類のコンテンツタイプで試してみました。

4
Torfi

この質問に遭遇した人のために、バージョン2.1以降、自動モデルバインディングがデフォルトで適用され、モデルバインディングが失敗した場合、400 Bad Requestが返されます(モデルバインディングが成功したかどうかを確認するためにModelState.IsValidをチェックする必要があった以前のバージョンからの変更)。

単純な型をasp.netコアコントローラーアクションに投稿する場合、それがどこから来ているかを指定する必要があります。複雑な型は推測できますが、intやstringなどの単純な型は推測できません(メッセージ本文にある場合。クエリ文字列またはroute(url)にある場合は推測されます)。本体自体に値を渡すために私が見る2つのオプションは次のとおりです。

  1. Urlエンコードされたフォーム値を使用(アクションのパラメーターに[FromForm]を追加)

郵便配達員からの依頼:

POST http://your-url/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded

value=test

アクションメソッドのシグネチャ:

[HttpPost]
public void Post([FromForm]string value)
{
}
  1. Json本体経由(アクションのパラメーターに[FromBody]を追加)

郵便配達員からのリクエスト:

POST http://your-url/api/values HTTP/1.1
Content-Type: application/json

"test"

アクションメソッドのシグネチャ:

[HttpPost]
public void Post([FromBody]string value)
{
}
4
Torfi