web-dev-qa-db-fra.com

Comment POST une valeur DateTime sur un contrôleur Web API 2

J'ai un exemple de contrôleur:

[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";
    }
}

Lorsque je lance une demande GET à: http://localhost:53456/api/Example/Foo?startDate=2016-01-01 cela fonctionne.

Lorsque je POST to http://localhost:53456/api/Example/Bar je reçois une erreur HTTP/1.1 400 Bad Request.

Voici mes POST données:

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

Qu'est-ce que je fais mal?

6
Pierre Nortje

Vous ne pouvez pas publier directement des non-objets, vous devez les envelopper dans un conteneur d’objets lorsque vous utilisez 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;}
}

L’autre façon que pourrait fonctionne est que si vous codez la valeur de cette manière en utilisant le symbole = ( vous l’envoyez en tant que non-objet, les accolades ont été supprimées ).

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

Essayez juste de poster:

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

Spécifier le nom de la propriété signifierait que votre ordinateur d'extrémité devra accepter un objet avec une propriété nommée startDate Dans ce cas, vous ne voulez transmettre qu'une DateTime.

4
hvaughan3

Le format de la date soumis est important et dépend de votre bibliothèque cliente. Cela doit ressembler à ceci (guillemets dans la charge brute du corps):

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

Pas d'accolades, pas de noms de propriété. Le format transmis à partir de votre code et/ou de votre bibliothèque client dépendra de l’envoi d’une date javascript ou d’une chaîne de caractères. Alors, modifiez le code de soumission de manière appropriée ...

0
Jim