X-www-form-urlencoded Vs json HTTP POST

Трудно решить,
в настоящее время я отправляю данные как x-www-form-urlencoded с php lib curl с

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($this->arguments));

или

curl_setopt($curl, CURLOPT_POSTFIELDS, $this->arguments);

первый вопрос: второй, кажется, больше длины контента, первое решение, вероятно, лучше?

Это практично для плоских сообщений вроде:

{
    "name": "John",
    "token": "2121232145",
    "code": "7",
    "data": "Hello"
}

Но у меня также может быть поле данных, представляющее объект, в этом случае я поддерживал его, но это (кодировка URL-кода Json) является ужасно подробными и уродливыми сообщениями,

С другой стороны, я попробовал отправить его как application/json content-type

curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->arguments));

длина содержимого больше для небольших сообщений, но со встроенным json, он явно лучше

Но x-www-form-urlencoded также близок к данным форм, которые мне нужно отправить, за исключением случаев, когда json встроен

Было бы не изящно иметь 2 разных метода анализа сервлетов в зависимости от типов содержимого, так есть ли еще один вариант?

Ответ 1

Здесь вы можете прочитать подобное обсуждение форматов.

Если структура закодированных данных гарантированно будет плоским списком пары имени-значения, x-www-form-urlencoded кажется достаточным. Если структура может быть (произвольно) сложной (например, вложенные списки или ассоциативные массивы), то определенно используйте JSON.

Что касается меня, я специалист KISS. В вашей ситуации JSON/XML/все это дополнительные затраты времени, памяти и циклов процессора. x-www-form-urlencoded data сочетают читаемость и компактность, поэтому я могу поспорить на ваш выбор.

Ответ 2

x-www-form-urlencoded и JSON - это разные вещи. В то время как x-www-form-urlencoded является просто типом контента по умолчанию, который использовался для отправки формы на сервер, JSON является текстовым и удобочитаемым форматом (стандартным) который используется для сериализации и отправки структурированных данных по сетевому соединению. Вы не должны сравнивать их.

вторая, кажется, большая длина контента, первое решение возможно лучше?

Нет, нет решения, помеченного как "лучше". Как сказал сосновый лес, это действительно зависит от того, какие данные вы отправляете и как разбирать/обрабатывать. JSON отлично подходит для отправки дополнительных данных с запросом.

Не думайте о содержании. Подумайте о структуре данных и данных, которую вы хотите отправить и обработать. Если вы просто хотите отправлять и обрабатывать структурированные данные между запросами и размером данных, просто используйте JSON. Он создан для этого.

Разница между контентом между двумя методами не будет частью проблемы, так как ваше приложение не является Facebook, Twitter или Google, как монстр. Преждевременная оптимизация - корень всего зла.