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:

  1. 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

  2. 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?

  3. définissant les paramètres de la route: api/contrôleur/date1/date2

  4. en utilisant un POST qui me permet de passer un objet avec des params.

  5. 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?

111
demandé sur Community 2012-06-07 22:18:48

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.

10
répondu LukLed 2012-06-07 19:15:06

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.

112
répondu Mark Pieszak - DevHelp.Online 2014-11-04 20:07:01

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 
46
répondu Graham Wright 2013-06-07 14:45:51

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...

42
répondu Nigel Findlater 2017-05-23 12:34:41

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
    }
}
35
répondu Andrew Veriga 2013-08-22 09:56:03

à 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
8
répondu VJAI 2012-06-08 10:53:41

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

8
répondu danan 2013-10-19 03:36:19
 [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

1
répondu ashwath hegde 2018-08-23 13:20:15