À l'aide de violon pour envoyer une requête POST à WebApi
Je suis en train d'écrire un simple WebApi programme, à l'aide de C#. (Je sais MVC assez bien, mais je suis nouveau sur WebApi.) Il contient un des Vendeurs de contrôleur (VendorsController.cs), qui contient un "getvendor" action comme le montre l'exemple de code ci-dessous:
[RoutePrefix("api/vendors")]
public class VendorsController : ApiController
{
[Route("getvendor"), HttpPost]
public TAPUser GetVendor([FromBody] string username)
{
Int32 userid = -1;
...
Les routes sont configurés comme suit:
//Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional
);
Je suis en utilisant un violon pour tester le programme. Tout d'abord, j'ai couru le code ci-dessus, sans [FromBody] et utilisé un violon pour envoyer une requête POST avec le nom de l'utilisateur dans l'url comme ceci:
http://localhost:60060/api/vendors/getvendor?username=tapuser
Cela a bien fonctionné. tapuser était passé comme argument à GetVendor et l'action renvoyé le résultat escompté.
Ensuite, j'ai ajouté [FromBody] et de mettre username=tapuser
dans le corps de la requête. Cette fois, quand j'ai envoyé la demande, tapuser
n'obtenez pas passé à l'action. L'argument de GetVendor()
était null
. J'ai essayé de variations sur le corps de la requête telles que { "username": "tapuser" }
, mais il n'aide pas. J'ai essayé de changer l'itinéraire de diverses manières, aussi, de telles que la modification de routeTemplate
à "api/{controller}/{action}/{id}"
. Qui n'a pas aidé non plus. Je suis sûr que je suis absent quelque chose de très simple, mais je n'ai juste pas le voir.
Note de côté: vue Brute de demande de Fiddler que le texte serait mieux que de l'image
POST localhost:60060/api/fournisseurs/getvendor HTTP/1.1 User-Agent: Fiddler Content-Type: application/json de l'Hôte: localhost:60060 Content-Length: 16 nom d'utilisateur=tapuser
Je viens de poster la vue brute. Désolé pour le manque de mise en forme.
OriginalL'auteur Tim | 2016-03-01
Vous devez vous connecter pour publier un commentaire.
Essayez de mettre votre valeur directement dans le corps de la requête. Voir cette.
thnx pour la compensation que pour n'importe quel objet en fonction du paramètre que nous n'avez pas besoin d'utiliser [Frombody], mais pour la simple nous avons besoin. Toutefois, afin de passer le paramètre string nous avons besoin d'un devis (Tim) - il pas comme vous sont la compréhension pourriez ne pas avoir besoin en cas d'int
OriginalL'auteur drunkcoder
Maintenant, j'ai un peu de débogage et a été en mesure de recréer le problème que vous.
J'ai été finalement en mesure d'obtenir les données à l'action en procédant de la manière suivante:
J'ai d'abord créé une classe pour agir en tant que conteneur pour la charge utile.
et mise à jour de l'action de match
Puis à l'aide de fiddler je compostés la demande à l'ordinateur d'extrémité à tester.
Lorsque mon point de rupture a été atteint le corps/charge utile a été rempli avec le nom d'utilisateur que tapuser.
Mise à JOUR
Alors que le ci-dessus a travaillé, je n'étais pas complètement sûr qu'il a résolu votre problème, j'ai donc fait quelques recherches sur google et suis tombé sur ce
Paramètre obligatoire dans ASP.NET Web API
Où qui a montré l'exemple suivant en utilisant
[FromBody]
Quand je revenue à mes premières modifications et suivi l'exemple, il a fonctionné comme prévu.
Espère que cette aide.
OriginalL'auteur Nkosi
J'ai découvert que si je mets 'tapuser" dans le corps de la requête, en utilisant des guillemets simples et doubles, il fonctionne. Les guillemets semblent être la réponse. Si je mets autre chose que tapuser à l'intérieur des citations, le tout est transmis en argument. Par exemple, '{username=tapuser}' sera adopté comme {username=tapuser}. Merci à tous pour vos commentaires.
OriginalL'auteur Tim