J'ai une API Web où j'ai 2 méthodes, une sans paramètre et deux avec différents types de paramètres (chaîne et int). Quand on appelle la méthode string ça ne marche pas ... qu'est-ce qui me manque ici?
public class MyControllerController : ApiController
{
public IHttpActionResult GetInt(int id)
{
return Ok(1);
}
public IHttpActionResult GetString(string test)
{
return Ok("it worked");
}
}
WebApiConfig.cs:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Mon appel:
/ api/MyController/MyString // ne fonctionne pas
/ api/MyController/1 // work
Je reçois l'erreur suivante:
Le dictionnaire de paramètres contient une entrée null pour le paramètre 'id' de type non-nullable 'System.Int32' pour la méthode 'System.Web.Http.IHttpActionResult GetInt (Int32)' dans 'TestAngular.Controllers.MyControllerController'. Un paramètre facultatif doit être un type de référence, un type nullable ou déclaré en tant que paramètre facultatif.
Qu'est-ce qui me manque dans ma demande?
Vous devez changer vos uri
/api/MyController
/api/MyController/string
/api/MyController/1
Vous n'êtes pas obligé de spécifier les méthodes.
Vous pouvez consulter ce tutorial sur asp.net pour plus de précisions.
Aussi cet uri devrait fonctionner:
api/MyController/GetAll
api/MyController/GetString?param=string
api/MyController/GetInt?param=1
Je pense que cela est beaucoup plus clair et devrait toujours fonctionner .. Vous utilisez le comportement de routage.
Voir ici: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection
Voici ma solution: Sans changer la route par défaut dans le fichier webapiconfig.cs
ajoutez juste une route à votre fonction string:
[Route("Api/MyController/GetString/{test}")]
public IHttpActionResult GetString(string test)
http: // localhost: 49609/api/MyController/GetString/stringtest
Cela fait un moment que vous avez posté ceci, mais je pense avoir la réponse… .. Tout d'abord, il y a deux problèmes. Tout d'abord, comme l'a noté Pinback, vous ne pouvez pas utiliser le même itinéraire pour deux points de terminaison différents.
Cependant, si vous éliminez simplement la méthode int
, vous rencontrerez toujours le problème . Rappelez-vous: la route par défaut ressemble à ceci: api/{controller}/{id} doit être appelé "id" et non pas "test".
Changez la signature en ceci:
public IHttpActionResult GetString(string id)
et ça va marcher. (vous pouvez également modifier {id}
en {test}
dans le fichier webapiconfig.cs).
Vous pouvez également prendre le paramètre de chaîne dans le corps
string body;
using (var sr = new StreamReader(Request.Body))
body = sr.ReadToEnd();