HttpWebRequest проблема с MonoTouch - PullRequest
       15

HttpWebRequest проблема с MonoTouch

0 голосов
/ 18 января 2011

Я не работал с Monotouch (или iphone в этом отношении) слишком долго, поэтому я думаю, что моя проблема связана с опытом.

Я создал приложение, которое должно взаимодействовать с веб-сервисом через json. Я использовал перенесенную библиотеку Json.NET, найденную здесь: https://github.com/chrisntr/Newtonsoft.Json

Сначала я создал приложение для Windows с использованием библиотеки Json.NET, просто чтобы быстро его опробовать. Это сработало отлично. Затем я написал точно такой же код в MonoDevelop, и сервер возвращает сообщение об ошибке, что он вообще не может распознать запрос. Обратите внимание, что я проверил, правильно ли работает сериализатор - строка json отформатирована правильно. Более того, оба приложения ведут себя одинаково до получения ответа от сервера.

JsonSerializer serializer = new JsonSerializer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(the uri of the service);
request.Method = "post";
request.ContentType = "application/x-www-form-urlencoded";
Query login = new Query(); // the object that will be serialized
login.module = "auth";
login.data.Add("username", username goes here);
login.data.Add("password", password goes here);
using (Stream s = request.GetRequestStream())
 {
                using (StreamWriter w = new StreamWriter(s))
                {
                   StringWriter sWriter = new StringWriter(new StringBuilder());
                   serializer.Serialize(sWriter, login);
                  w.Write("&query="+sWriter.ToString());
                }
 }
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
        {
            var reader = new StreamReader(resp.GetResponseStream());
            JsonReader  r = new JsonTextReader(reader);
  Response login_response = (Response)serializer.Deserialize(reader, typeof(Response));
        }

Когда я впервые написал приложение для Windows, сервер не смог распознать мои запросы, потому что заголовок Content был установлен на «application / json» и потому что он требует доставки запроса в виде пары ключ-значение (с «query»). как ключ). Это причина для w.Write ("query =" + sWriter.ToString ()); , В сценарии php, который был представлен в качестве примера вызова службы, эта строка была настроена следующим образом: curl_setopt ($ ch, CURLOPT_POSTFIELDS, массив ('query' => jsonEncode ($ data)));

Однако, поскольку я исправил заголовки типов содержимого и добавил «запрос =» перед строкой, код отлично работает в Visual Studio и Mono Develop. Он даже работал на моем телефоне Android после того, как я написал его на Java. Однако в MonoTouch сервер всегда не может распознать поток запросов как запрос. Что может быть причиной этого? Есть ли что-то особенное, что происходит с потоком запросов в MonoTouch, в отличие от других? Опять же, я проверил строку, которая попадает в поток, она верна и одинакова для всех тестовых приложений.

Заранее спасибо.

1 Ответ

1 голос
/ 06 февраля 2011

Переустановил MonoDevelop и проблема исчезла.

...