1

OK,Правильный способ обработки символа амперсанд в JSON строку отправить REST веб-службы

Я использую System.Runtime.Serialization и DataContractJsonSerialization.

Проблема в том, что в запросе я посылаю значение свойства с символом &. Скачайте, AT&T, и я получаю ответ с ошибкой: Invalid JSON Data.

Я думал, что экранирование будет выполнено внутри библиотеки, но теперь я вижу, что сериализация остается нетронутой символом амперсанда &.

Да, для формата JSON это действительно. Но это будет проблемой для моего запроса POST, так как мне нужно отправить его на сервер, который, если содержит амперсанд, будет отвечать с ошибкой, следовательно, я здесь.

HttpUtility.HtmlEncode находится в библиотеке System.Web, поэтому путь можно использовать, используя Uri.EscapeUriString. Я сделал это, чтобы попытаться, но так или иначе, и без него все запросы работают нормально, за исключением амперсанда в ценности.

EDIT: HttpUtility класс переносится на SDK для Windows Phone, но предпочитаемый способ кодирования строки должен быть Uri.EscapeUriString.

Первой мыслью было замарать руки и начать замену специального символа, который вызовет проблему на сервере, но, интересно, есть ли другое решение, которое я должен сделать, чтобы оно было эффективным и «правильным»?

Я должен сказать, что я использую

// Convert the string into a byte array. 
byte[] postBytes = Encoding.UTF8.GetBytes(data); 

Чтобы преобразовать JSON в byte[] и записи в Stream. И

request.ContentType = "application/x-www-form-urlencoded"; 

Как WebRequest.ContentType.

Итак, я испорчен по какой-то причине или что-то, что я пропустил?

спасибо.

+0

Вы говорите, что вы отправляете данные JSON, но тип контента говорит иначе ('application/x-www-form-urlencoded'). Можете ли вы опубликовать дополнительную информацию о том, как вы отправляете данные и как служба их получает? – carlosfigueira

+0

Даже изменяя его, сервер возвращает 500. –

+0

Что вы используете на сервере? Можете ли вы разместить код сервера? – carlosfigueira

ответ

4

Проблема заключалась в том, что я кодировал всю строку запроса, включая ключ. У меня был запрос data={JSON}, и я форматировал его, но часть {JSON} должна быть закодирована.

string requestData = "data=" + Uri.EncodeDataString(json) // worked perfect! 

Глупое отверстие для входа.

+0

Интересно. Спасибо, что поделился. – weiglt

+0

Нет проблем. Это решает мое дело, вы никогда не знаете, кто еще мог пропустить что-то подобное. На самом деле это сочетание клиент-серверного контракта. Сервер выполняет поиск, если в теле есть ключевой «данные», и если он не принимает все тело, пытающееся десериализовать его, то в моем случае это не удалось из-за того, что символ амперсанда пытается отделить в качестве параметра. –

2

Вы попробовали заменить амперсанд & для POST?

+0

Если я заменил & &, это тоже не сработает. –

+0

Вы никогда не должны включать обычный амперсанд в любую полезную нагрузку URL-запроса, но всегда кодируете его. Так что я бы сказал, да, вы должны заняться там и сделать некоторую кодировку. Возможно, посмотрите: http://stackoverflow.com/questions/11294107/how-can-i-send-the-ampersand-character-via-ajax, encodeURIComponent(), похоже, работает. – weiglt

+0

Я не против, я просто хотел убедиться, что это так. И как должна быть сделана замена для другой стороны, чтобы получить правильное значение? Я использую Uri.EscapeUriString для кодирования. –

 Смежные вопросы

  • Нет связанных вопросов^_^