web-dev-qa-db-fra.com

appel à l'API Web avec paramètre de chaîne

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?

9
MrProgram

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.

7
Christos

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

6
PinBack

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

5
sa_

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

3
kensuprime

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();
0
codeInDream