Le paramètre FromBody string donne null

C'est probablement quelque chose de très basique, mais j'ai du mal à comprendre où je vais mal.

j'essaye de saisir une chaîne du corps d'un POST, mais "jsonString" ne montre que nul. Je veux aussi éviter d'utiliser un modèle, mais peut-être que ce n'est pas possible. Le morceau de code que je frappe avec PostMan est ce morceau:

[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] string jsonString)
{
    ...
}

peut-être que c'est quelque chose que je fais incorrectement avec postman, mais j'ai essayé d'utiliser "= test" (comme vu dans d'autres questions posées sur ce sujet) dans la section value de la section body - x-www-form-urlencoded avec la touche jsmonstring et rien. J'ai également essayé d'utiliser le texte brut et le texte brut/simple. Je l'obtenir l'id donc je sais que l'url est correcte. Toute aide à ce serait grandement apprécié.

PostMan est configuré comme ceci:

POST http://localhost:8000/Edit/Test?id=111
key = id  value = 111
Body - x-www-form-urlencoded
key = jsonString  value = "=test"
16
demandé sur Nkosi 2016-11-28 23:48:04

7 réponses

en déclarant le paramètre jsonString avec [FromBody] vous dites ASP.NET Core pour utiliser le formatteur d'entrée pour lier le JSON (ou XML) fourni à un modèle. Ainsi votre test devrait fonctionner, si vous fournissez une classe de modèle simple

public class MyModel
{
    public string Key {get; set;}
}

[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] MyModel model)
{
    ... model.Key....
}

et un JSON envoyé comme

{
    key: "value"
}

bien sûr, vous pouvez sauter la liaison de modèle et récupérer les données fournies directement en accédant HttpContext.Request dans le contrôleur. HttpContext.Request.Body propriété vous donne le flux de contenu ou vous pouvez accéder au formulaire de données par HttpContext.Request.Forms.

je préfère personnellement la liaison de modèle en raison de la sécurité de type.

26
répondu Ralf Bönning 2016-11-28 21:03:12

Référencement Parameter Binding in ASP.NET API Web

À L'Aide De [FromBody]

pour forcer L'API Web à lire un type simple à partir du corps de la requête, ajouter le [FromBody] attribut au paramètre:

[Route("Edit/Test")]
[HttpPost]
public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... }

dans cet exemple, L'API Web utilisera un formatteur de type media pour lire la valeur de jsonString dans le corps de la requête. Voici un exemple de client demande.

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/json
Content-Length: 6

"test"

Lorsqu'un paramètre a [FromBody], L'API Web utilise L'en-tête Content-Type pour sélectionner un formateur. Dans cet exemple, le type de contenu est "application / json" et le corps de la requête est une chaîne JSON brute (pas une Objet JSON).

Dans l'exemple ci-dessus, aucun modèle n'est nécessaire si les données sont fournies dans le format correct dans le corps.

Pour l'URL encodé une requête devrait ressembler à ceci

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

=test
24
répondu Nkosi 2016-11-29 02:37:42

Lorsqu'on a l'attribut [FromBody], la chaîne envoyée ne doit pas être une chaîne brute, mais plutôt une chaîne JSON car elle inclut les guillemets d'enrubannage:

"test"

basé sur https://weblog.west-wind.com/posts/2017/Sep/14/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers

réponse similaire la valeur de la chaîne de caractères est vide lorsqu'on utilise FromBody dans asp.net api web

7
répondu Michael Freidgeim 2018-01-10 09:27:14

Vous êtes sur la bonne voie.

sur votre en-tête

Content-Type: application/x-www-form-urlencoded

le corps de la requête POST doit être =test et rien d'autre. Pour les chaînes de caractères inconnues/variables, vous devez encoder la valeur de manière à ce que vous ne vous échappiez pas accidentellement avec un caractère d'entrée.


Voir aussi POST-chaîne de ASP.NET l'Api Web de l'application renvoie la valeur null

4
répondu Igor 2017-05-23 12:34:39

Dans mon cas, j'ai oublié d'utiliser JSON.stringify (bodytuff).

1
répondu Eugene 2018-06-01 08:36:05

je sais que cette réponse est un peu vieille et il y a de très bonnes réponses qui résolvent déjà le problème.



afin d'étendre la question, j'aimerais mentionner une chose qui m'a rendu fou pendant les 4 ou 5 dernières heures.



C'est TRÈS TRÈS TRÈS TRÈS il est important que vos propriétés dans votre classe de modèle aient le set l'attribut permettre.



Ce WILL NOT travail (paramètre toujours null):

/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
    return form;
}
/* Model class code */
public class Weird {
    public string UserId {get;}
    public string UserPwd {get;}
}

:

/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
    return form;
}
/* Model class code */
public class Weird {
    public string UserId {get; set;}
    public string UserPwd {get; set;}
}
0
répondu Miquel 2018-05-01 17:57:09

a Finalement obtenu ce travail après 1 heure de lutte.

ceci supprimera la question nulle, obtient aussi le JSON key1valeur valeur1, de manière générique (pas de reliure de modèle), .

pour une nouvelle application WebApi 2 Exemple:

Facteur (ressemble exactement, comme ci-dessous):

POST    http://localhost:61402/api/values   [Send]

              Body
                   (*) raw             JSON (application/json) v

"{  \"key1\": \"value1\" }"

le port 61402 ou url /api/ ci-dessus, peut être différent pour vous.

ValuesController.cs

using Newtonsoft.Json;
// ..

// POST api/values
[HttpPost]
public object Post([FromBody]string jsonString)
{
    // add reference to Newtonsoft.Json
    //  using Newtonsoft.Json;

    // jsonString to myJsonObj
    var myJsonObj = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);

    // value1 is myJsonObj[key1]
    var valueOfkey1 = myJsonObj["key1"];

    return myJsonObj;
}

tout est bon pour l'instant, pas sûr si la liaison de model à une classe est nécessaire si j'ai des sous-clés, ou, peut-être DeserializeObject sur la sous-clé fonctionnera.

0
répondu Manohar Reddy Poreddy 2018-08-24 11:12:04