2016-06-16 1 views
-1

Je l'adresse suivante:Comment passer plusieurs paramètres à WebAPI?

http://localhost/api/values/100/some+string+here 

Dans l'application WebAPI ValuesController, je ceci:

[HttpGet] 
[Route("api/values/{p1}/{p2}")] 
public HttpResponseMessage Get (string p1, string p2) { 
... 
} 

Pour l'appelant, il frappe jamais api web. Au lieu de cela, il revient avec un 404.

Une idée de ce qui ne va pas?

+0

Il pourrait avoir quelque chose à voir avec 'values'. Essayez de remplacer ceci par le nom de contrôleur approprié, comme 'Home' (si votre ApiController s'appelait' HomeController'). – Igor

+0

peut être utile de vérifier cela http://stackoverflow.com/questions/12835074/mvc4-web-api-rest-interface-with-multiple-parameters – terbubbs

+1

Je ne peux pas reproduire votre problème. J'ai essayé d'utiliser la dernière version de Web-API 2.2. J'ai utilisé divers noms de contrôleurs d'API Web et votre même URI et méthode que vous avez affichés, il est frappé à chaque fois par les valeurs. Choses à vérifier. Assurez-vous que la classe que vous avez définie hérite de 'ApiController' (et non de Controller). Publiez la configuration de routage par défaut dans le fichier webapiconfig.cs. Assurez-vous que votre WebApiConfig.cs est en cours d'initialisation au démarrage. – Igor

Répondre

1

Vous utilisez Attribute Routing in ASP.NET Web API 2. Assurez-vous de configurer votre API Web pour utiliser le routage d'attribut avec MapHttpAttributeRoutes.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Suivant assurez-vous que vous avez défini votre contrôleur correctement

public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("api/values/{p1}/{p2}")] 
    public HttpResponseMessage Get (string p1, string p2) { 
    ... 
    } 
} 

Vous pouvez même utiliser RoutePrefix

[RoutePrefix("api/values")] 
public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("{p1}/{p2}")] 
    public HttpResponseMessage Get (string p1, string p2) { 
    ... 
    } 
} 

Aussi, si comme dans votre exemple, vous voulez que le premier paramètre à un entier. alors vous pouvez utiliser une contrainte de route et une méthode de mise à jour.

[RoutePrefix("api/values")] 
public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("{p1:int}/{p2}")] 
    public HttpResponseMessage Get (int p1, string p2) { 
    ... 
    } 
} 

MISE À JOUR:

Création d'un test d'intégration du contrôleur de valeurs et a été en mesure de confirmer que l'action a été appelé

[TestMethod] 
public async Task HttpClient_Should_Get_OKStatus_From_Action_With_Multiple_Parameters() { 
    var config = new HttpConfiguration(); 
    config.MapHttpAttributeRoutes(); 

    using (var server = new HttpServer(config)) { 

     var client = new HttpClient(server); 

     string url = "http://localhost/api/values/100/some+string+here"; 

     using (var response = await client.GetAsync(url)) { 
      Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
     } 
    } 
} 
+0

Sauf pour RoutePrefex, tout ce que vous avez mentionné est généré automatiquement dans une application WebAPI. – 4thSpace

+0

Pas toujours. dépend de la version du studio visuel que vous utilisez. – Nkosi

+0

Le premier paramètre est une chaîne. – 4thSpace