Le paramètre de chaîne FromBody donne la valeur null

C’est probablement quelque chose de très fondamental, mais j’ai du mal à comprendre où j’ai tort.

J’essaie de saisir une chaîne du corps d’un POST, mais “jsonSsortingng” n’affiche que la valeur null. 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] ssortingng jsonSsortingng) { ... } 

C’est peut-être quelque chose que je ne fais pas correctement avec postier, mais j’ai essayé d’utiliser “= test” (comme indiqué dans d’autres questions posées à ce sujet) dans la section valeur du corps – section x-www-form-urlencoded la clé comme jsonSsortingng et rien. J’ai également essayé d’utiliser raw-text et raw-text / plain. Je reçois l’identifiant afin que je sache que l’URL est correcte. Toute l’aide pouvant etre apscope serait très appréciée.

PostMan est configuré comme ceci actuellement:

 POST http://localhost:8000/Edit/Test?id=111 key = id value = 111 Body - x-www-form-urlencoded key = jsonSsortingng value = "=test" 

    En déclarant le paramètre jsonSsortingng avec [FromBody] vous indiquez à ASP.NET Core d’utiliser le formateur d’entrée pour lier le code JSON (ou XML) fourni à un modèle. Votre test devrait donc fonctionner si vous fournissez une classe de modèle simple

     public class MyModel { public ssortingng 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 ignorer la liaison de modèle et récupérer directement les données fournies en accédant à HttpContext.Request dans le contrôleur. La propriété HttpContext.Request.Body vous donne le stream de contenu ou vous pouvez accéder aux données du formulaire via HttpContext.Request.Forms .

    Personnellement, je préfère le modèle de liaison en raison du type de sécurité.

    Référence de la liaison de parameters dans l’API Web ASP.NET

    Utiliser [FromBody]

    Pour forcer l’API Web à lire un type simple à partir du corps de la demande, ajoutez l’atsortingbut [FromBody] au paramètre:

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

    Dans cet exemple, l’API Web utilisera un formateur de type média pour lire la valeur de jsonSsortingng à partir du corps de la demande. Voici un exemple de demande client.

     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 demande est une chaîne JSON brute (et non un object JSON).

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

    Pour une URL encodée, une requête ressemblerait à 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 

    Avec l’atsortingbut [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’habillage:

     "test" 

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

    Une valeur de chaîne de réponse similaire est vide lors de l’utilisation de FromBody dans asp.net web api

    Tu es sur la bonne piste.

    Sur votre en-tête

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

    Le corps de la demande POST devrait être =test et rien d’autre. Pour les chaînes inconnues / variables, vous devez encoder la valeur dans l’URL de manière à ne pas échapper accidentellement à un caractère saisi.


    Voir aussi Chaîne POST dans l’application ASP.NET Web Api – Renvoie null

    Dans mon cas, j’ai oublié d’utiliser JSON.ssortingngify (bodyStuff).

    Je sais que cette réponse est un peu ancienne et il existe de très bonnes réponses qui résolvent déjà le problème.

    Afin d’élargir le sujet, je voudrais mentionner une dernière chose qui m’a rendue folle pendant les 4 ou 5 dernières heures.

    Il est TRES TRES TRES important que l’atsortingbut set soit activé dans vos propriétés de votre classe de modèle.

    Cela NE FONCTIONNERA PAS (paramètre toujours nul):

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

    Cela fonctionnera:

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

    Je l’ai finalement obtenu après une heure de combat.

    Cela supprimera le problème null, obtiendra également la valeur value1 de la clé JSON1 , de manière générique (aucune liaison de modèle) ,.

    Pour un nouvel exemple d’application WebApi 2:

    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 les valeurs url / api / ci-dessus peuvent être différents pour vous.

    ValuesController.cs

     using Newtonsoft.Json; // .. // POST api/values [HttpPost] public object Post([FromBody]ssortingng jsonSsortingng) { // add reference to Newtonsoft.Json // using Newtonsoft.Json; // jsonSsortingng to myJsonObj var myJsonObj = JsonConvert.DeserializeObject>(jsonSsortingng); // value1 is myJsonObj[key1] var valueOfkey1 = myJsonObj["key1"]; return myJsonObj; } 

    Tout va bien pour le moment, je ne sais pas si une liaison de modèle à une classe est requirejse si j’ai des sous-clés ou si DeserializeObject sur une sous-clé fonctionnera.