2010-06-30 8 views
1

J'ai réussi à ajouter et à utiliser une action Get dans mon nouveau service REST dans .Net à l'aide de WCF et du Rest-toolkit. Le service est défini comme suit:Utilisation de POST in Rest avec .Net

[OperationContract] 
[WebGet(UriTemplate = "/{id}")] 
Foo GetFooById(string id); 

Et je l'appelle comme ça du côté client:

public Foo GetFoo(string id) 
{ 
    var httpClient = new HttpClient("http://127.0.0.1:8000/"); 
    var response = httpClient.Get("foo/" + id); 
    return response.Content.ReadAsDataContract<Foo>(); 
} 

Maintenant, je veux ajouter une action POST, mais comment définissez-vous, et comment cartographiez-vous les paramètres?

Répondre

2

Pour les paramètres POST, vous devez le sérialiser à l'aide de DataContractSerializer. par exemple,

Sur le serveur:

[OperationContract] 
[WebInvoke(Method="POST",UriTemplate = "/foos")] 
void PostFoo(Foo foo) {} 

Le client:

var foo = new Foo(); 
var content = HttpContentExtensions.CreateDataContract<Foo>(foo); 
var client = new HttpClient("http://example.org/service.svc/foos"); 
client.Post(content) 

S'il vous plaît noter, aucun compilateur a été impliqué lors de la création de ce code, méfiez-vous acheteur.

+0

Merci! Ça promet. Mais comment sait-il quel paramètre l'objet foo devrait aller? Dans ce cas, c'est évident, mais que se passerait-il s'il y avait deux paramètres de type foo - ou string d'ailleurs. Pouvez-vous nommer les paramètres d'une manière ou d'une autre? – stiank81

+0

Le dernier paramètre est le corps du message. L'autre paramètre correspondra au nom basé sur le modèle d'URI. –

+0

"Le dernier paramètre est le corps du message" - Est-ce une règle générale? Et ne pouvez-vous pas passer plus d'un paramètre post? Les nommer en quelque sorte lors de l'appel du service ..? – stiank81

0

Je crois que vous l'enveloppez en XML. Il est question ici (réponse fournie):

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/00c93f9f-f1f3-4f08-9927-db0e4ed91d2d

vous devez également spécifier le type de contenu de la demande que l'application/xml. C'est ainsi que vous transmettez également des classes personnalisées (la représentation XML de ces classes).

Vous le définissez à l'aide de l'attribut WebInvoke, très similaire à la façon dont vous avez utilisé le WebGet. Toutefois, WebInvoke n'utilise pas les espaces réservés d'URL que vous avez utilisés dans le WebGet.

2

Vous devez l'WebInvoke attribut au lieu de WebGet:

[OperationContract] 
[[WebInvoke(Method = "POST", UriTemplate = "/{id}")] 
Foo PutFooById(string id, Foo foo) 

Notez que « POST » est en fait la méthode par défaut, il peut être omis si vous le désirez.

+0

Merci, et j'ai effectivement eu cette partie. Mon problème est comment passer les données de poste. Pour cette fonction - comment passez-vous foo? Comment ajouter les post-données du côté client, et comment le service va-t-il maintenant l'adresser au paramètre "foo"? – stiank81

+0

IlRC (cela fait longtemps) que vous postez un 'Foo' sérialisé comme corps de message dans le' POST'. Je vais vérifier plus tard si vous en avez besoin confirmé plus en détail. –

+0

Ok - mais que faire si vous voulez poster plus d'un argument? Par exemple. un foo et deux cordes. Comment les cartographie-t-il? Je suppose que vous avez besoin de les nommer d'une manière ou d'une autre? – stiank81