Стандартный способ сериализации 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 &ы; возврат = колонок
-
PHP
с помощью http_build_query
: -columns [0] = name & -columns [1] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule &; -предел = 5 &ы; возврат = колонок
-
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) я проверил параметры, он дает мне именно то, что вы хотите.: -)
![введите описание изображения здесь]()