0

我在使用 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 请求,但它如下所示:

"{"requests":["sendMessage",{"body":"你好

大家"}]}"

虽然我想发送的是

"{"requests":["sendMessage",{"body":"Hello\n\neverybody"}]}"

有任何想法吗??

谢谢你们

4

1 回答 1

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"
        }
      }
    ]
  ]
}
于 2011-07-31T18:12:34.250 回答