Comment appeler une méthode dans ApiController avec la requête http?
J'ai un ApiController nommé Service
. J'ai une méthode nommée UpdatePrice
. Maintenant, je veux envoyer un http requête web à partir d'un autre projet par je recevoir le code d'erreur 404. Et si je l'exécute dans le navigateur, je vois ceci:
<Error>
<Message>No HTTP resource was found that matches the request URI 'http://localhost:26769/api/service/updateprice?priceId=16&cost=1234&lastUpdate=2014-10-15 11:41:54.000'.</Message>
<MessageDetail>No type was found that matches the controller named 'service'.</MessageDetail>
</Error>
C'est le ApiController:
public class Service : ApiController
{
PriceApplication priceApp = new PriceApplication();
public int UpdatePrice(int priceId,int cost,DateTime lastUpdate)
{
try
{
var price = priceApp.GetByPriceId(priceId);
price.Cost = Convert.ToDecimal(cost);
price.LastUpdate = lastUpdate;
priceApp.Update(price);
return cost;
}
catch
{
return -1;
}
}
}
C'est le routage:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { controller = "service",action="updateprice", id = RouteParameter.Optional}
);
Et c'est la demande:
string serviceUrl = string.Format("http://localhost:26769/api/service/updateprice?priceId={0}&cost={1}&lastUpdate={2}", priceId, cost, DateTime.Now);
WebRequest request = WebRequest.Create(serviceUrl);
WebResponse response = request.GetResponse();
Renommer votre contrôleur
Aussi, vous devez utiliser la POSTE pour les mises à jour, pas AVOIR!
Le retour de paramètres (lastUpdate et priceId et le coût) sont à venir à partir d'un service de chenille de projet et comme il n'a pas de références pour le projet principal des modèles de domaine j'ai été obligé de le passer en GET.
ce n'est pas une raison valable, vous pouvez toujours afficher les valeurs sans avoir une référence pour le modèle de domaine, c'est juste un ensemble de paires clé-valeur qui le classeur de modèles de lecture pour remplir votre modèle sur le côté serveur.
l'objet que vous passez à l'API n'a pas à être le modèle lui-même, vous pouvez créer une
ServiceController
. Vous pouvez également envisager d'attribut de routage. asp.net/web-api/overview/web-api-routing-and-actions/...Aussi, vous devez utiliser la POSTE pour les mises à jour, pas AVOIR!
Le retour de paramètres (lastUpdate et priceId et le coût) sont à venir à partir d'un service de chenille de projet et comme il n'a pas de références pour le projet principal des modèles de domaine j'ai été obligé de le passer en GET.
ce n'est pas une raison valable, vous pouvez toujours afficher les valeurs sans avoir une référence pour le modèle de domaine, c'est juste un ensemble de paires clé-valeur qui le classeur de modèles de lecture pour remplir votre modèle sur le côté serveur.
l'objet que vous passez à l'API n'a pas à être le modèle lui-même, vous pouvez créer une
public class PriceUpdate { public int PriceId {get;set;} public decimal Cost{get;set;}}
que vous postez sur le contrôleur et ensuite charger le dossier et le mettre à jour sur la base de ces valeurs. Le problème avec un GET est qu'une demande de lecture peut modifier les données qui n'est pas le comportement attenduOriginalL'auteur Hamid Reza | 2014-10-15
Vous devez vous connecter pour publier un commentaire.
Si vous avez incorrecte nom du contrôleur (il devrait se termine avec *Contrôleur) et de mauvaises routes. Essayez de renommer votre contrôleur à
ServiceController
et de mettre à jour vos routes comme ça:Et le format de votre URL comme ça:
Et ajouter
[HttpGet]
attribut sur votreUpdatePrice
action:500 erreur lié à un mauvais format datetime. Essayez ISO formatage ou jj-MM-aaaa (ne me souviens pas qui a utilisé dans datetime modèle de classeur). Pour 405 également pas tout à fait clair, on peu avoir sur votre action et l'envoi de la requête Get.. Peut-être essayer de décorer votre action avec HttpGet ou essayez d'accéder à ce lien de navigateur pour voir quelle est la différence.
est l'utilisation de [HttpGet] ou c'est juste une convention générale ?
il est nécessaire, sinon il sera par défaut à la POSTE (sauf verbe peut être résolue dans le nom de l'action par exemple, si elle commence par Get, Put, Delete et etc, comme PutComment).
Je vous remercie beaucoup. Je l'ai vu de nombreux endroits, et je ne savais pas si c'était quelque chose de nécessaire ou d'une convention générale.
OriginalL'auteur Vladimirs
Comme d'autres l'ont dit, le nom de tous vos contrôleurs devrait prendre fin en
Controller
. C'est une convention qui est par défaut en MVC et WebAPI. Si vous souhaitez le changer pour WebAPI vous avez besoin d'écrire une coutumeIHttpControllerTypeResolver
.Vous avez seulement besoin d'avoir une détaillé de l'itinéraire si vous souhaitez que votre URL params à l'air sympa. Si non,
api/{controller}/{action}/{id}
avec l'id option est fine. Paramètres supplémentaires que vous envoyez viens de finir dans la chaîne de requête.Utilisation
HttpUtility.UrlEncode(param)
pour chaque paramètre avant de construire l'URL si vous êtes l'envoi d'objets via la route ou de la chaîne de requête. Si vous êtes de les envoyer via le corps de la requête (POST
ouPUT
), vous pouvez les envoyer, comme ils sont.OriginalL'auteur Radu Porumb