Веб-клиент неправильно интерпретирует ввод символов в WP7 - PullRequest
0 голосов
/ 31 июля 2011

У меня проблема с использованием метода 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 "{ "тело":" Hello

все "}]}"

Пока я хочу отправить

"{" запросы ": [" SendMessage "{ "тело": "Привет \ п \ neverybody"}]}"

Есть идеи ??

Спасибо всем

1 Ответ

0 голосов
/ 31 июля 2011

Да, вам нужно выполнить соответствующее экранирование JSON. Лично я бы использовал библиотеку JSON для этого - я использовал Json.NET в Windows Phone 7, и она работала нормально.

Вы создадите свой запрос как объект 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"
        }
      }
    ]
  ]
}
...