web-dev-qa-db-ja.com

POST Web API 2コントローラへのDateTime値の方法

コントローラの例があります:

[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
    [Route("Foo")]
    [HttpGet]
    public string Foo([FromUri] string startDate)
    {
        return "This is working";
    }

    [Route("Bar")]
    [HttpPost]
    public string Bar([FromBody] DateTime startDate)
    {
        return "This is not working";
    }
}

GETリクエストを発行すると:http://localhost:53456/api/Example/Foo?startDate=2016-01-01 できます。

I POST to http://localhost:53456/api/Example/Bar受け取りましたHTTP/1.1 400 Bad Requestエラー。

これは私のPOSTデータです:

{
"startDate":"2016-01-01T00:00:00.0000000-00:00"
}

何が悪いのですか?

7
Pierre Nortje

非オブジェクトを直接投稿することはできません。FromBodyを使用する場合は、オブジェクトコンテナーをオブジェクトコンテナーの内側にラップする必要があります。

[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
    [Route("Foo")]
    [HttpGet]
    public string Foo([FromUri] string startDate)
    {
        return "This is working";
    }

    [Route("Bar")]
    [HttpPost]
    public string Bar([FromBody] BarData data)
    {
        return "This is not working";
    }
}

public class BarData{
    public DateTime startDate {get;set;}
}

それ以外の方法couldは、=記号を使用してこのような値をフォームエンコードする場合(非オブジェクトとして送信していることに注意してください)中括弧削除されました)。

"=2016-01-01T00:00:00.0000000-00:00"
10
Igor

POSTするだけです。

{
  "2016-01-01T00:00:00.0000000-00:00"
}

プロパティ名を指定すると、エンドポイントはstartDateという名前のプロパティを持つオブジェクトを受け入れる必要があります。この場合、DateTimeのみを渡します。

5
hvaughan3

提出された日付の形式は重要であり、クライアントライブラリによって異なります。これは次のようになります(未加工の本文ペイロードの引用符)。

"2015-05-02T00:00:00"

中括弧、プロパティ名はありません。コードまたはクライアントライブラリ、あるいはその両方から送信される形式は、JavaScriptの日付を送信するか、日付の文字列表現を送信するかによって異なります。したがって、提出コードを適切に調整します...

0
Jim