C # REST клиент отправляет данные с помощью POST - PullRequest
7 голосов
/ 04 октября 2010

Я пытаюсь отправить простой запрос POST в веб-службу REST и распечатать ответ (код ниже, в основном, взят из документации разработчика Yahoo! и фрагментов кода MSDN, предоставленных вместе с некоторой документацией). Я ожидаю, что клиент отправит:

Метод запроса: POST (т.е. я ожидаю $ _SERVER ['REQUEST_METHOD'] == 'POST' в PHP)
Данные: foo = bar (то есть $ _POST ['foo'] == 'bar' в PHP)

Тем не менее, похоже, что отправка:

Метод запроса: FOO = BARPOST
Данные: (пусто)

Я знаю, что API работает, поскольку я тестировал его с клиентами, написанными на Python и PHP, поэтому я почти уверен, что это должно быть проблемой с моим C #. Я не программист .NET по профессии, поэтому был бы признателен за любые комментарии / указания о том, как выяснить, в чем проблема - я уверен, что это что-то тривиальное, но я не могу определить это сам.

переменные uri, user и password установлены ранее в коде - они отлично работают с 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();

API REST написан на PHP, а массив $ _POST на сервере пуст при использовании клиента C #.

1 Ответ

9 голосов
/ 05 октября 2010

В конечном итоге найдено свойство HttpWebRequest.PreAuthenticate, которое, по-видимому, решает проблему, если код редактируется следующим образом:

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

Из документации я предполагаю, что это форсирует аутентификацию перед отправкой фактического запроса POST. Я не уверен, почему класс не делает это автоматически (библиотеки для других языков делают этот процесс прозрачным, если вы явно не отключите его), но это решило проблему для меня и может сэкономить кому-то еще 2 дня поиска и таскание за волосы.

Для чего стоит PreAuthenticate не нужно устанавливать для запросов GET, только для POST, хотя, если вы установите его для запроса GET, все будет работать, но займет немного больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...