我使用WebClient.UploadStringAsync方法遇到了问题。我要向外部服务器发送带有一些信息的POST请求,并且在该请求中,我要将文本包含在TextBox中。
我所做的是以下内容:
Uri url = new Uri("http://www.someweb.com");
string request = "{\"requests\":[\"sendMessage\",{\"body\":\"" + newMessageTextBox.Text + "\"}]}";
WebClient wb = new WebClient();
wb.UploadStringCompleted += new UploadStringCompletedEventHandler(nb_UploadStringCompleted);
wb.UploadStringAsync(url, "Post", request);
没有问题,但是如果我包含带有返回的消息,就像 “你好
大家” 服务器发回错误。如果我用Wireshark嗅探我的流量,我可以看到我的POST请求,但它如下:
“{” 请求 “:[” 的sendMessage “{ ”体“:” 你好
大家 “}]}”
虽然我想发送的是
“{” 请求 “:[” 的sendMessage “{ ”体“: ”你好\ n \ neverybody“}]}”
任何想法??
谢谢大家
答案 0 :(得分:0)
是的,您需要执行适当的JSON转义。就个人而言,我会使用JSON库 - 我在Windows Phone 7中使用过Json.NET并且它工作正常。
您将您的请求构建为JSON对象 - 因此根本不指定JSON文本表单本身 - 然后要求它将自身格式化为字符串(仅通过调用ToString
)。例如:
using System;
using Newtonsoft.Json.Linq;
class Program
{
static void Main(string[] args)
{
string text = "Hello\neverybody";
JObject json = new JObject
{
{ "requests", new JArray
{
new JObject
{
{ "sendMessage", new JObject
{
{ "body", text }
}
}
}
}
}
};
Console.WriteLine(json);
}
}
输出:
{
"requests": [
{
"sendMessage": {
"body": "Hello\neverybody"
}
}
]
}
(显然你不需要使用那么多的空格,如果你不想这样做。你也不必使用对象初始化器。)
编辑:好的,根据要求进行更改:
JObject json = new JObject
{
{ "sid", sid },
{ "version", "0.6" },
{ "requests", new JArray
{
new JArray
{
new JObject
{
{ "sendMessage", new JObject
{
{ "body", text },
{ "recipient", recipient },
{ "legacy", false },
{ "thread_key", threadKey }
}
}
}
}
}
}
};
结果:
{
"sid": "sid",
"version": "0.6",
"requests": [
[
{
"sendMessage": {
"body": "Hello\neverybody",
"recipient": "foo@bar.com",
"legacy": false,
"thread_key": "T1"
}
}
]
]
}