Я не работал с 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, в отличие от других? Опять же, я проверил строку, которая попадает в поток, она верна и одинакова для всех тестовых приложений.
Заранее спасибо.