2010-10-04 2 views
6

J'essaie d'envoyer une requête POST simple à un service Web REST et d'imprimer la réponse (le code ci-dessous provient principalement de la documentation du développeur Yahoo! et des extraits de code MSDN fournis avec La documentation). Je me attends à ce que le client à envoyer:Client C# REST envoyant des données à l'aide de POST

demande Méthode: POST (c.-à-je me attends $ _SERVER [ 'REQUEST_METHOD'] == 'POST' en PHP)
Data: foo = bar (ie $ _POST [ 'foo' ] == 'bar' en PHP)

Cependant, il semble envoyer:

demande Méthode: FOO = BARPOST
données: (blanc)

Je sais que l'API fonctionne comme je l » Je l'ai testé avec des clients écrits en PHP et Python, donc je suis sûr que ça doit être un problème avec mon C#. Je ne suis pas un programmeur .NET par le commerce donc j'apprécierais tous les commentaires/pointeurs sur la façon de comprendre quel est le problème - je suis sûr que c'est quelque chose de trivial mais je ne peux pas le repérer moi-même. Les variables uri, user et password sont définies plus tôt dans le code - elles fonctionnent correctement avec les requêtes GET.

request = (HttpWebRequest) WebRequest.Create(uri); 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 
request.ContentType = "application/x-www-form-urlencoded"; 

string postData = "foo=bar"; 
request.ContentLength = postData.Length; 

StreamWriter postStream = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); 
postStream.Write(postData); 
postStream.Close(); 

response = (HttpWebResponse) request.GetResponse(); 

L'API REST est écrit en PHP et le tableau $ _POST est vide sur le serveur lors de l'utilisation du client C#.

Répondre

9

finalement trouvé la propriété HttpWebRequest.PreAuthenticate qui semble résoudre le problème si le code est modifié comme ceci:

request = (HttpWebRequest) WebRequest.Create(uri); 
request.PreAuthenticate = true; 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 

De la documentation, je suppose que cette authentification des forces avant que la demande POST réelle est envoyée. Je ne sais pas pourquoi la classe ne le fait pas automatiquement (les bibliothèques pour d'autres langues rendent ce processus transparent, sauf si vous l'éteignez explicitement), mais cela a résolu le problème et peut sauver quelqu'un d'autre 2 jours de recherche et tirant les cheveux. Pour ce que ça vaut, PreAuthenticate n'a pas besoin d'être défini pour les requêtes GET, seulement POST, bien que si vous le définissez pour une requête GET tout fonctionnera encore, mais prendra un peu plus de temps.

Questions connexes