Стандартный способ сериализации JSON для строки запроса?

Я пытаюсь создать спокойный API, и я борюсь за то, как сериализовать данные JSON на HTTP query string.

Существует ряд обязательных и необязательных аргументов, которые должны быть переданы в запросе, например (представленный как объект JSON ниже):

{
   "-columns" : [
      "name",
      "column"
   ],
   "-where" : {
      "-or" : {
         "customer_id" : 1,
         "services" : "schedule"
      }
   },
   "-limit" : 5,
   "return" : "table"
}

Мне нужно поддерживать различное количество разных клиентов, поэтому я ищу стандартизованный способ преобразования этого json-объекта в строку запроса. Есть ли он и как он выглядит?

Другая альтернатива - позволить пользователям просто пройти по объекту json в теле сообщения, но я прочитал, что я должен его избегать (HTTP GET с телом запроса).

Любые мысли?

Изменить для пояснения:

Перечислите, как некоторые разные языки кодируют данный json-объект выше:

  • jQuery с помощью $.param: -columns [] = name & -columns [] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & предел = 5 &ampы; возврат = колонок
  • PHP с помощью http_build_query: -columns [0] = name & -columns [1] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule &; -предел = 5 &ampы; возврат = колонок
  • Perl с помощью URI::query_form: -columns = name & -columns = column & -where = HASH (0x59d6eb8) & -limit = 5 & return = column
  • Perl с помощью complex_to_query: -columns: 0 = name & -columns: 1 = column & -limit = 5 & -where.- или .customer_id = 1 & -where.-or.services = schedule & возврат = столбец

jQuery и PHP очень похожи. Perl, использующий complex_to_query, также очень похож на них. Но никто не выглядит точно таким же.

Ответ 1

URL-encode (https://en.wikipedia.org/wiki/Percent-encoding) ваш текст JSON и поместите его в один параметр строки запроса. например, если вы хотите передать {"val": 1}:

mysite.com/path?json=%7B%22val%22%3A%201%7D

Обратите внимание, что если ваш JSON слишком длинный, вы столкнетесь с проблемой ограничения длины URL. В этом случае я бы использовал POST с телом (да, я знаю, отправляя POST, когда вы хотите что-то извлечь, не является "чистым" и не очень хорошо вписывается в парадигму REST, но ни один из них не является вашим конкретным доменом JSON-язык запросов).

Ответ 2

Другим вариантом может быть node-querystring. Он также использует аналогичную схему для тех, которые вы указали до сих пор.

Он доступен как в npm, так и в bower, поэтому я его использовал.

Ответ 3

Как насчет того, чтобы вы попытались отправить их следующим образом:

http://example.com/api/wtf?
[-columns][]=name&
[-columns][]=column&
[-where][-or][customer_id]=1&
[-where][-or][services]=schedule&
[-limit]=5&
[return]=table&

Я попробовал с клиентом REST введите описание изображения здесь

И на стороне сервера (Ruby with Sinatra) я проверил параметры, он дает мне именно то, что вы хотите.: -)

введите описание изображения здесь