различия в приложении / json и приложении / x-www-form-urlencoded

159

В чем разница между

request.ContentType = "application / json; charset = utf-8";

и

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

Притхви Радж Нандивал
источник

Ответы:

188

В первом случае сообщается веб-серверу, что вы публикуете данные JSON, как показано ниже:

{ Name : 'John Smith', Age: 23}

Второй вариант - сообщить веб-серверу, что вы будете кодировать параметры в URL-адресе, как показано ниже:

Name=John+Smith&Age=23
Икар
источник
17
Какие последствия это имеет на стороне сервера. Я вижу такие сайты, как stackoverflow и Twitter, которые используются x-www-form-urlencodedдля запросов AJAX, таких как голосование и т. Д. Ответ отправлен JSON. Я думаю, что лучше иметь симметричную пару запрос / ответ, т.е. оба JSON.
пользователь
@buffer Мне также интересно узнать ответ на ваш симметричный вопрос.
Адам Джонс
1
@AdamJohns: этот блог стоит прочитать, хотя он не совсем отвечает на вопрос «почему»: homakov.blogspot.in/2012/06/…
пользователь
22
@buffer Насколько я понимаю, использование JSON в качестве contentType помогает, когда данные для отправки являются более сложными и требуют большой иерархии .. тогда как закодированная форма удобна для отправки простых параметров в URL, которые можно прочитать на сервере без большого количества кода. .. Я думаю, это отвечает на вопрос почему.
Анкит Шривастава
@Medorator Поздний комментарий. Хотя, например, когда вы отправляете сложный объект JSON с массивом объектов в нем, использование application/x-www-form-urlencodedможет привести к путанице на сервере (в моем случае Elixir использует Poison) и привести к неуместному разбору объекта (он каким-то образом преобразует вложенный массив объектов на карту, а не список). Использование application/jsonдолжно быть правильным выбором в этом случае.
xji
6

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

  1. Откуда взято имя application / x-www-form-urlencoded ?

    Если вы отправляете HTTP- запрос GET , вы можете использовать параметры запроса следующим образом:

    http://example.com/path/to/page? Имя = хорек и цвет = фиолетовый

    Содержимое полей кодируется в виде строки запроса. В application/x-www-form- urlencodedназвании «S приходит из предыдущего параметра запроса URL , но параметры запроса в где теле запроса вместо URL.

    Все данные формы отправляются в виде длинной строки запроса. Строка запроса содержит пары имя- значение, разделенные символом &

    например, field1 = value1 & field2 = value2

  2. Это может быть простой запрос, называемый простым - не вызывайте предполетную проверку

    Простой запрос должен иметь некоторые свойства. Вы можете посмотреть здесь для получения дополнительной информации. Одним из них является то, что для заголовка Content-Type разрешено только три значения для простых запросов

    • применение / х-WWW-форм-urlencoded
    • многочастному / форм-данных,
    • текст / обычный

3. Для в основном плоских деревьев параметров проверяется и проверяется application / x-www-form-urlencoded.

request.ContentType = "application / json; charset = utf-8";

  1. Данные будут в формате JSON .

axios и superagent , две из наиболее популярных HTTP-библиотек npm, по умолчанию работают с телами JSON.

{
  "id": 1,
  "name": "Foo",
  "price": 123,
  "tags": [
    "Bar",
    "Eek"
  ],
  "stock": {
    "warehouse": 300,
    "retail": 20
  }
}
  1. Content-Type "application / json" является одним из Предварительно выданных запросов .

Теперь, если запрос не является простым запросом , браузер автоматически отправляет HTTP-запрос перед исходным методом OPTIONS, чтобы проверить, безопасно ли отправлять исходный запрос. Если все в порядке, то отправьте актуальный запрос. Вы можете посмотреть здесь для получения дополнительной информации.

  1. application / json подходит для начинающих. Массивы в кодировке URL могут быть кошмаром!
fgul
источник