Стандартный способ сериализации JSON в строку запроса?
я пытаюсь построить restful API
и я изо всех сил пытаюсь сериализовать JSON
данные HTTP query string
.
существует ряд обязательных и необязательных аргументов, которые необходимо передать в запросе, e.g (представлен как объект 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&-limit=5&return=column -
PHP
используяhttp_build_query
: -columns[0]=name&-columns[1]=column&-where[-or][customer_id]=1&-where[-or][services]=schedule&-limit=5&return=column -
Perl
используяURI::query_form
: -колонны=имя колонки=колонки& -, где=хэш(0x59d6eb8)&лимит=5&возврат=столбец -
Perl
используяcomplex_to_query
: - столбцы: 0=имя& - столбцы: 1=столбец&-предел=5&-где.-или.идентификатора customer_id=1&-где.-или.услуги=расписание и возврат=столбец
jQuery и PHP очень похожи. Perl, использующий complex_to_query, также очень похож на них. Но все они выглядят по-разному.
4 ответов
URL-кодирование (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).
другой вариант может быть node-querystring. Он также использует аналогичную схему для тех, которые вы до сих пор перечислили.
Он доступен в обоих npm
и bower
, поэтому я и использую его.
Как насчет того, чтобы попробовать отправить их следующим образом:
http://example.com/api/wtf?
[-columns][]=name&
[-columns][]=column&
[-where][-or][customer_id]=1&
[-where][-or][services]=schedule&
[-limit]=5&
[return]=table&
и на стороне сервера (рубиновый с Синатрой) я проверил параметры, это дает мне именно то, что вы хотите. :-)
нет единого стандарта для JSON для сериализации строк запроса, поэтому я сделал сравнение некоторых сериализаторов JSON и результаты следующие:
JSON: {"_id":"5973782bdb9a930533b05cb2","isActive":true,"balance":",446.35","age":32,"name":"Logan Keller","email":"logankeller@artiq.com","phone":"+1 (952) 533-2258","friends":[{"id":0,"name":"Colon Salazar"},{"id":1,"name":"French Mcneil"},{"id":2,"name":"Carol Martin"}],"favoriteFruit":"banana"}
Rison: (_id:'5973782bdb9a930533b05cb2',age:32,balance:',446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258')
O-Rison: _id:'5973782bdb9a930533b05cb2',age:32,balance:',446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258'
JSURL: ~(_id~'5973782bdb9a930533b05cb2~isActive~true~balance~'!1*2c446.35~age~32~name~'Logan*20Keller~email~'logankeller*40artiq.com~phone~'*2b1*20*28952*29*20533-2258~friends~(~(id~0~name~'Colon*20Salazar)~(id~1~name~'French*20Mcneil)~(id~2~name~'Carol*20Martin))~favoriteFruit~'banana)
QS: _id=5973782bdb9a930533b05cb2&isActive=true&balance=,446.35&age=32&name=Logan Keller&email=logankeller@artiq.com&phone=+1 (952) 533-2258&friends[0][id]=0&friends[0][name]=Colon Salazar&friends[1][id]=1&friends[1][name]=French Mcneil&friends[2][id]=2&friends[2][name]=Carol Martin&favoriteFruit=banana
URLON: $_id=5973782bdb9a930533b05cb2&isActive:true&balance=,446.35&age:32&name=Logan%20Keller&email=logankeller@artiq.com&phone=+1%20(952)%20533-2258&friends@$id:0&name=Colon%20Salazar;&$id:1&name=French%20Mcneil;&$id:2&name=Carol%20Martin;;&favoriteFruit=banana
QS-JSON: isActive=true&balance=%241%2C446.35&age=32&name=Logan+Keller&email=logankeller%40artiq.com&phone=%2B1+(952)+533-2258&friends(0).id=0&friends(0).name=Colon+Salazar&friends(1).id=1&friends(1).name=French+Mcneil&friends(2).id=2&friends(2).name=Carol+Martin&favoriteFruit=banana
самый короткий среди них обозначение объекта URL.