我长时间没有使用Monotouch(或iphone),所以我猜我的问题与经验有关。
我创建了一个需要通过json与Web服务进行通信的应用程序。我使用了这里找到的移植的Json.NET库:https://github.com/chrisntr/Newtonsoft.Json
首先,我使用Json.NET库创建了一个Windows应用程序,只是为了快速尝试一下。它工作得很好。然后我在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应用程序时,服务器无法识别我的查询,因为内容标头设置为“application / json”,因为它要求将查询作为键值对传递(带有“查询”)作为关键)。这就是w.Write的原因(“query =”+ sWriter.ToString()); 。在作为调用服务的示例提供的php脚本中,此行设置如下: curl_setopt($ ch,CURLOPT_POSTFIELDS,array('query'=> jsonEncode($ data)));
但是,由于我修复了内容类型标题并在字符串前添加了“query =”,因此代码在Visual Studio和Mono Develop中完美运行。在用Java编写之后,它甚至可以在我的Android手机上运行。但是,在MonoTouch中,服务器始终无法将请求流识别为查询。可能是什么原因造成的? MonoTouch中的请求流发生了什么特殊情况,而不是其他地方?同样,我检查了进入流的字符串,它是正确的,并且对于所有测试应用程序都是相同的。
提前谢谢。
答案 0 :(得分:1)
重新安装的MonoDevelop和问题消失了。