2015-02-14 2 views
1

Мне нужно отправить некоторые значения JSON на сервер, используя POST-запросы; отправка их без каких-либо экранирующих работ прекрасна, но это не правильное решение, так как эти значения могут содержать специальные символы? и &.
Я пробовал ответы на другие вопросы (Uri.EscapeDataString, Uri.EscapeUriString, System.Net.WebUtility.UrlEncode, System.Web.HttpUtility.UrlEncode), но все они заставляют сервер возвращать ошибку «Плохой запрос».
Как я могу избежать значений POST ?Как правильно удалить тело POST?

+0

'' '' '' '' '' '' '' '' '' '' '' ' JSON, насколько я могу думать. Но твои заботы действительны, все равно. Как вы сериализуете JSON? Если вы используете библиотеку - довольно хорошо какую-либо библиотеку - она ​​должна справляться с экранированием. Если вы сами строите строку, это немного сложнее, но я считаю, что единственная проблема - это двойные кавычки, которые могут быть экранированы с помощью обратного слэша. Но реалистично, я бы настоятельно советовал использовать библиотеку, если производительность не является критичной, а использование является низким. Это будет просто более здорово. –

+0

@Matthew Haugen, о чем я беспокоюсь, является действительностью моих данных как * Тело запроса POST * – user626528

+0

Тело запроса HTTP (POST или иначе) - это просто байты, длина которых определяется заголовком 'Content-Length' (или что-то в этом роде, если используется кодированное кодирование). Вам не нужно беспокоиться о том, чтобы что-то ускользнуло, чтобы работать, побег только начинает играть на следующем уровне вверх, тип контента. –

ответ

2

После нашей небольшой беседы в комментариях, я думаю, я достаточно знаю о том, что вы просите, чтобы собрать ответ. Так вот.

Я вижу три незначительно заданных вопроса.

  1. Как можно избежать запроса HTTP POST?

Я процитирую свой комментарий по этому вопросу, так как он довольно полный.

Тело запроса HTTP (POST или иное) - это просто байты, длина которых определяется заголовком Content-Length (или что-то в этом роде, если используется кодированное кодирование). Вам не нужно беспокоиться о том, чтобы что-то ускользнуло, чтобы работать, побег только начинает играть на следующем уровне вверх, тип контента.

По существу, нет никаких требований к любому виду экранирования для ванильного POST для прохождения.

  1. Как делать application/json и application/x-www-formurl-encoded играть вместе?

В большинстве случаев их просто нет. Они могут, и я думаю, что видел это раньше, но я не могу думать о том, зачем вам это нужно.

Только для фона, и чтобы убедиться, что мы на одной странице, вот тот же объект, сериализованный в JSON и данные формы соответственно.

Обычный объект (для сравнения):

PropertyName: The value is "1 & 2" 
OtherProperty: 2 

JSON:

{ 
    "PropertyName" : "The value is \"1 & 2\"", 
    "OtherProperty" : 2 
} 

Форма данных:

PropertyName=The%20value%20is%20%221%20%26%202%22&OtherProperty=2 

Это значение получил довольно грязно, как вы можете видеть. Но вы понимаете.

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

  1. Как избежать JSON?

Если вы используете библиотеку, эта библиотека должна (если она того стоит) сделает это за вас. Например, JSON.net.Я считаю, что единственное, что вам нужно было бы беспокоиться об экранировании, - это двойные кавычки в JSON, но я не эксперт, и мне было бы не удивляться, если бы узнали, что есть крайние случаи.

Повторюсь из моего комментария, так как он вам помог.

В большинстве современных API («большинство» и «современных» для перевода есть), JSON - довольно разумное ожидание, да. Итак, мы вернемся к моему первому комментарию и скажем, что вам действительно нужно будет беспокоиться об экранировании самих элементов JSON, и если вы используете библиотеку, это должно быть обработано для вас. Разумеется, вы явно не хотите двойного кодирования по очевидным причинам.

Быстрое тестирование всей вашей установки, конечно же, заключается в том, чтобы попытаться отправить регулярные данные (контроль) и убедиться, что это работает, а затем отправить что-то с помощью двойной кавычки и, если хотите, вопрос отметка.

Если вы запустите этот тест, а второй провалится, есть хороший шанс, что что-то не является собственностью. Это может быть приятное время для использования инструментов отладки или даже для приложения, такого как Fiddler, для проверки полезной нагрузки запроса для чего-то необоснованного, например, если ваш JSON был похож на { "name":"val"ue" }

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