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"
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.
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
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"
réponse similaire la valeur de la chaîne de caractères est vide lorsqu'on utilise FromBody dans asp.net api web
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
Dans mon cas, j'ai oublié d'utiliser JSON.stringify (bodytuff).
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;}
}
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.