1. ホーム
  2. c#

[解決済み] web-api の POST ボディオブジェクトは常に null です。

2023-08-21 01:17:33

質問

まだWeb APIを勉強中なので、愚問と思われたらご容赦ください。

私はこれを私の StudentController :

public HttpResponseMessage PostStudent([FromBody]Models.Student student)
{
    if (DBManager.createStudent(student) != null)
        return Request.CreateResponse(HttpStatusCode.Created, student);
    else
        return Request.CreateResponse(HttpStatusCode.BadRequest, student);
}

これが機能しているかどうかをテストするために、Google Chromeの拡張機能である "Postman" を使って、HTTP POSTリクエストを構築してテストしています。

これは私の生のPOSTリクエストです。

POST /api/Student HTTP/1.1
Host: localhost:1118
Content-Type: application/json
Cache-Control: no-cache

{"student": [{"name":"John Doe", "age":18, "country":"United States of America"}]}

student はオブジェクトのはずですが、アプリケーションをデバッグすると、APIが受け取った student オブジェクトを受け取りますが、コンテンツは常に null .

どのように解決するのですか?

FromBody は、入力された POST 値がプリミティブ型でない場合、パラメータが非 null になるために特定の形式である必要があるという点で、奇妙な属性です。(学生はこちら)

  1. でリクエストを試してみてください。 {"name":"John Doe", "age":18, "country":"United States of America"} をjsonとしてリクエストしてみてください。
  2. を削除します。 [FromBody] 属性を削除して、解決策を試してみてください。プリミティブでない型でも動くはずです。(学生)
  3. を使って [FromBody] 属性の値を送信することもできます。 =Value 形式ではなく key=value 形式ではありません。この場合、キー値である student は空の文字列でなければならないことになります...

他にも、studentクラスのカスタムモデルバインダーを書き、カスタムバインダーでパラメータを属性化する方法があります。