Comment passer plusieurs paramètres à un ASP.Net une API Web?
j'utilise L'API Web.Net MVC4 pour (espérons) implémenter une api RESTful. J'ai besoin de passer quelques paramètres au système et lui faire effectuer une certaine action, puis retourner une liste d'objets que les résultats. Plus précisément, je fais passer deux dates et je renvoie des dossiers qui se trouvent entre les deux. Je fais également le suivi des dossiers retournés afin que les appels subséquents ne soient pas traités de nouveau dans le système.
j'ai envisagé quelques approches:
-
sérialiser les params en une seule chaîne de JSON et la séparer dans L'API. http://forums.asp.net/t/1807316.aspx/1
-
passez les paramètres dans la chaîne de requête.
Quelle est la meilleure façon de passer plusieurs paramètres de requête à une api restful? -
définissant les paramètres de la route: api/contrôleur/date1/date2
-
en utilisant un POST qui me permet de passer un objet avec des params.
-
rechercher ODATA puisque L'API Web le supporte (actuellement). Je n'ai pas encore fait grand-chose avec ça, donc je ne le connais pas très bien.
il semble que les bonnes pratiques de repos indiquent quand les données sont tirées, vous devriez utiliser un GET. Toutefois, se doit aussi être nullipotent (ne produit pas d'effets secondaires), et je me demande si ma mise en œuvre spécifique viole que puisque je marque des enregistrements dans le système API, donc je produit des effets secondaires.
cela m'a également amené à la question de la prise en charge des paramètres variables. Si la liste des paramètres d'entrée change, il serait fastidieux de devoir redéfinir votre route pour le choix 3 si cela arrive souvent. Et ce qui pourrait se passer si les paramètres sont définis à l'exécution...
In dans tous les cas, pour ma mise en œuvre spécifique, quel choix (le cas échéant) semble le meilleur?
8 réponses
que signifie CE Marquage? Si cela n'est utilisé qu'à des fins de journalisation, J'utiliserais GET et disable all caching, puisque vous voulez enregistrer toutes les requêtes pour ces ressources. Si cette notation d'enregistrement est a un autre but, POST est la voie à suivre. L'utilisateur doit savoir, que ses actions affectent le système et la méthode de POST est un avertissement.
je pense que la façon la plus facile est simplement d'utiliser AttributeRouting
.
c'est évident dans votre contrôleur, pourquoi voudriez-vous cela dans votre fichier Global WebApiConfig
?
exemple:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}
les noms {}
doivent correspondre à vos paramètres.
aussi Simple que cela, maintenant vous avez un GET
séparé qui gère plusieurs params dans cette instance.
il suffit d'ajouter une nouvelle route aux entrées WebApiConfig
.
par exemple, pour appeler:
public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..
ajouter:
config.Routes.MapHttpRoute(
name: "GetPagedData",
routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);
puis Ajouter les paramètres à L'appel HTTP:
GET //<service address>/Api/Data/2/10
j'ai juste dû implémenter une api RESTfull où j'ai besoin de passer des paramètres. J'ai fait cela en passant les paramètres dans la chaîne de requête dans le même style que celui décrit par le premier exemple de Mark "api/controller?start=date1&fin=date2"
dans le controller j'ai utilisé une astuce de URL split en C#?
// uri: /api/courses
public IEnumerable<Course> Get()
{
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var system = nvc["System"];
// BL comes here
return _courses;
}
dans mon cas j'appelais le WebApi via Ajax comme:
$.ajax({
url: '/api/DbMetaData',
type: 'GET',
data: { system : 'My System',
searchString: '123' },
dataType: 'json',
success: function (data) {
$.each(data, function (index, v) {
alert(index + ': ' + v.name);
});
},
statusCode: {
404: function () {
alert('Failed');
}
}
});
j'espère que aider...
j'ai trouvé une solution exellente sur http://habrahabr.ru/post/164945 /
public class ResourceQuery
{
public string Param1 { get; set; }
public int OptionalParam2 { get; set; }
}
public class SampleResourceController : ApiController
{
public SampleResourceModel Get([FromUri] ResourceQuery query)
{
// action
}
}
à l'Aide GET ou POST est clairement expliqué par @LukLed . En ce qui concerne la façon dont vous pouvez passer les paramètres, je suggère d'aller avec la deuxième approche (Je ne sais pas beaucoup sur ODATA non plus).
1.Sérialiser les params en une seule chaîne JSON et les séparer dans L'API. http://forums.asp.net/t/1807316.aspx/1
Ce n'est pas user friendly et SEO friendly
2.Passer les paramètres dans la chaîne de requête. Quelle est la meilleure façon de passer plusieurs paramètres de requête à une api restful?
C'est l'habitude préférable.
3.Définir les paramètres de l'itinéraire: api/contrôleur/date1/date2
Ce n'est certainement pas une bonne approche. Cela donne l'impression qu'un date2
est une sous-ressource de date1
et ce n'est pas le cas. Les deux date1
et date2
sont des paramètres de requête et vient dans le même niveau.
dans le cas simple, je suggérerais une URI comme celle-ci,
api/controller?start=date1&end=date2
mais j'aime personnellement le modèle URI ci-dessous, mais dans ce cas, nous devons écrire un code personnalisé pour la carte paramètre.
api/controller/date1,date2
utiliser la liaison de paramètre comme décrire complètement ici : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
[Route("api/controller/{one}/{two}")]
public string Get(int One, int Two)
{
return "both params of the root link({one},{two}) and Get function parameters (one, two) should be same ";
}
les paramètres de la liaison racine ({un}, {deux}) et de la fonction Get (un, deux) doivent être les mêmes