J'essaie de publier plusieurs paramètres sur un contrôleur WebAPI. Un paramètre provient de l'URL et l'autre du corps. Voici l'url:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Voici mon code de contrôleur:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
Le contenu du corps est en JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Une idée pourquoi la liaison par défaut ne peut pas se lier à l' offerPriceParameters
argument de mon contrôleur? Il est toujours défini sur null. Mais je suis capable de récupérer les données du corps en utilisant le DataContractJsonSerializer
.
J'essaye également d'utiliser l' FromBody
attribut de l'argument mais cela ne fonctionne pas non plus.
.net
asp.net-web-api
Normand Bédard
la source
la source
Nativement WebAPI ne prend pas en charge la liaison de plusieurs paramètres POST. Comme le souligne Colin, il existe un certain nombre de limitations décrites dans mon article de blog auquel il fait référence.
Il existe une solution de contournement en créant un classeur de paramètres personnalisé. Le code pour faire cela est moche et alambiqué, mais j'ai posté du code avec une explication détaillée sur mon blog, prêt à être branché dans un projet ici:
Passer plusieurs valeurs POST simples à l'API Web ASP.NET
la source
Si le routage d'attributs est utilisé, vous pouvez utiliser les attributs [FromUri] et [FromBody].
Exemple:
la source
[FromRoute]
place de[FromUri]
Nous avons passé l'objet Json par la méthode HttpPost et l'avons analysé en objet dynamique. ça fonctionne bien. ceci est un exemple de code:
webapi:
Le type d'objet complexe peut être objet, tableau et dictionnaire.
la source
Une simple classe de paramètres peut être utilisée pour passer plusieurs paramètres dans un article:
la source
Vous pouvez autoriser plusieurs paramètres POST à l'aide de la classe MultiPostParameterBinding de https://github.com/keith5000/MultiPostParameterBinding
Pour l'utiliser:
1) Téléchargez le code dans le dossier Source et ajoutez-le à votre projet d'API Web ou à tout autre projet de la solution.
2) Utilisez l'attribut [MultiPostParameters] sur les méthodes d'action qui doivent prendre en charge plusieurs paramètres POST.
3) Ajoutez cette ligne dans Global.asax.cs à la méthode Application_Start n'importe où avant l'appel à GlobalConfiguration.Configure (WebApiConfig.Register) :
4) Demandez à vos clients de transmettre les paramètres en tant que propriétés d'un objet. Un exemple d'objet JSON pour la
DoSomething(param1, param2, param3)
méthode est:Exemple JQuery:
Visitez le lien pour plus de détails.
Avertissement: je suis directement associé à la ressource liée.
la source
Belle question et commentaires - beaucoup appris des réponses ici :)
Comme exemple supplémentaire, notez que vous pouvez également mélanger le corps et les routes, par exemple
Appelant comme ça:
la source
À quoi ressemble votre routeTemplate pour ce cas?
Vous avez publié cette URL:
Pour que cela fonctionne, je m'attendrais à un routage comme celui-ci dans votre
WebApiConfig
:D'autres hypothèses sont: - votre contrôleur est appelé
OffersController
. - l'objet JSON que vous passez dans le corps de la requête est de typeOfferPriceParameters
(pas de type dérivé) - vous n'avez aucune autre méthode sur le contrôleur qui pourrait interférer avec celle-ci (si vous le faites, essayez de les commenter et voyez ce que arrive)Et comme Filip l'a mentionné, cela aiderait vos questions si vous commenciez à accepter certaines réponses, car `` taux d'acceptation de 0% '' pourrait faire croire aux gens qu'ils perdent leur temps.
la source
Si vous ne souhaitez pas utiliser ModelBinding, vous pouvez utiliser les DTO pour le faire pour vous. Par exemple, créez une action POST dans DataLayer qui accepte un type complexe et envoie des données depuis le BusinessLayer. Vous pouvez le faire en cas d'appel UI-> API.
Voici un exemple de DTO. Attribuer un enseignant à un étudiant et attribuer plusieurs articles / sujets à l'étudiant.
Ensuite, l'action dans le DataLayer peut être créée comme:
Pour l'appeler depuis le BusinessLayer:
Maintenant, cela fonctionnera toujours si je souhaite envoyer les données de plusieurs étudiants à la fois. Modifiez les éléments
MyAction
ci-dessous. Pas besoin d'écrire [FromBody], WebAPI2 prend le type complexe [FromBody] par défaut.puis en l'appelant, passez un fichier
List<StudentCurriculumDTO>
de données.la source
Demander des paramètres comme
Le code de l'API Web ressemble à
la source
Vous pouvez obtenir les données de formulaire sous forme de chaîne:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
la source