2013-04-08 65 views
42

我试图建立一个宁静的API,我正在努力如何将JSON数据序列化为HTTP query string标准化的方式来序列化JSON查询字符串?

有许多问题需要在该请求,例如要传递必需和可选参数(表示为下面JSON对象):

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

我需要支持各种数量的不同的客户端,从而我正在寻找一种标准化的方式来将此json对象转换为查询字符串。有没有,它看起来如何?

另一种选择是允许用户只传递邮件正文中的json对象,但我读到应该避免它(HTTP GET with request body)。

有什么想法?

编辑澄清:

清单如何一些不同的语言编码给定的JSON对象以上:使用$.param

  • jQuery:-columns [] =名& -columns [] =柱& -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & -limit = 5 & return = column
  • PHP使用http_build_query:-columns [0] =名& -columns [1] =柱& -where [-OR] [CUSTOMER_ID] = 1 & -where [-OR] [服务] =时间表& -limit = 5 &返回=柱
  • Perl使用URI::query_form:-columns =名& -columns =柱& -where = HASH(0x59d6eb8)& -limit = 5 &回报=使用complex_to_query
  • Perl:-columns:0 =名& - 列:1 =列& -limit = 5 & -where.-or.customer_id = 1 & -where.-or.services =时间表&回报=柱

jQuery和PHP是非常相似的。使用complex_to_query的Perl也非常类似于它们。但没有一个看起来完全一样。

+0

为什么不只是使用POST请求? – akonsu 2013-04-08 06:34:20

+1

检查是否有帮助, http://api.jquery.com/jQuery.param/ – Jubair 2013-04-08 06:37:36

+6

@akonsu:因为我试图获取(GET)一些数据,而不是POST新数据。 – Andreas 2013-04-08 06:38:11

回答

38

URL编码(https://en.wikipedia.org/wiki/Percent-encoding)您的JSON文本并将其放入单个查询字符串参数。例如,如果你想通过{"val": 1}

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

需要注意的是,如果你的JSON变得很长,那么你会碰到一个URL长度的限制问题。在这种情况下,我会使用POST和一个body(是的,我知道,发送POST时,如果您要获取某些内容不是“纯”的,并且不适合REST范例,但是您的域特定的基于JSON的查询语言)。

+1

是的,这可能是一种方法来实现这一点。我怀疑我会遇到URL长度限制问题。我不知道什么是最好的:1)传递单个json参数2)使用POST(尽管我们正在GET)或3)使用GET与消息正文。也许支持1)和3)? – Andreas 2013-04-08 08:34:59

+1

顺便说一下,我使用的“基于JSON的查询语言”来自SQL :: Abstract :: More:http://search.cpan.org/~dami/SQL-Abstract-More-1.11/lib/ SQL/Abstract/More.pm – Andreas 2013-04-08 08:37:27

+1

我会实现1)和2)。我会尽可能多地使用1),当URL变得太长时,我会使用'POST'。带有身体的“GET”我不喜欢,因为它很奇怪,尽管它在技术上是可行的。 – akonsu 2013-04-08 09:24:57

4

另一个选项可能是node-querystring。它也使用了与你迄今列出的类似的方案。

它在npmbower都可用,这就是我一直在使用它的原因。

2

你怎么样试试这个送他们如下:

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

我试着用REST客户 enter image description here

和服务器端(红宝石与西纳特拉)我查了一下参数,可以它给我正是你想要的。 :-)

enter image description here