郵便配達員からファイル->新しいプロジェクトで作成された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本体で機能させることができましたが、単純なタイプを機能させることができず、さまざまな種類のコンテンツタイプで試してみました。
この質問に遭遇した人のために、バージョン2.1以降、自動モデルバインディングがデフォルトで適用され、モデルバインディングが失敗した場合、400 Bad Requestが返されます(モデルバインディングが成功したかどうかを確認するためにModelState.IsValidをチェックする必要があった以前のバージョンからの変更)。
単純な型をasp.netコアコントローラーアクションに投稿する場合、それがどこから来ているかを指定する必要があります。複雑な型は推測できますが、intやstringなどの単純な型は推測できません(メッセージ本文にある場合。クエリ文字列またはroute(url)にある場合は推測されます)。本体自体に値を渡すために私が見る2つのオプションは次のとおりです。
郵便配達員からの依頼:
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)
{
}
郵便配達員からのリクエスト:
POST http://your-url/api/values HTTP/1.1
Content-Type: application/json
"test"
アクションメソッドのシグネチャ:
[HttpPost]
public void Post([FromBody]string value)
{
}