2012-08-25 105 views
0

我想对在Flask上运行的我的RESTful API使用类型为'GET'的jQuery ajax调用。在我的请求中,我想将一些数据作为JSON发布。将json嵌入到jquery ajax GET请求

我正在为POST请求做同样的事情,他们像魅力一样工作。但是使用GET Flask会给我提供400个错误,并且深入了解它,看起来JSON在路上({%22email%22:%[email protected]%22})部分被URIEncoded编码。

我试过使用decodeURIComponent,因为我是JSON.stringifying json的ajax数据参数,但没有区别。

sessiontoken = "123abc"; 
jsonData = {"email": email}; 

$.ajax({ 
    type: 'GET', 
    crossDomain: true, 
    url: 'http://someserver/sessions/' + sessiontoken, 
    dataType: 'json', 
    processData: false, //added this to see if it helps, it didn't 
    contentType: "application/json", 
    async: false, 
    data: JSON.stringify(jsonData), 
    success: function(data){ 
     //I'd be happy 
    }, 
    error: function(data){ 
     //This is where I get as my backend throws a 400 on me due to the screwed up json 
    } 
}); 

这使我疯狂,因为我似乎无法在地球上找到任何人有同样的问题。我以前一直在谩骂,以前从未面对过这种愚蠢的事情。

编辑:好吧,好像我需要放弃我的目标,只是传递任何参数作为查询字符串,而不是尝试将它们添加到请求正文。我想这里没有什么错,例如这里讨论的:REST API Best practices: Where to put parameters?

回答

1

如果你试图设置任何数据到ajax的GET请求,它将被转换为URL字符串的参数。 Ofcourse,如“任何符号将被表示为%URL_CODE(see all codes),你会得到查询关键词,比如未来:组织你的RESTful服务

http://someserver/sessions/sessiontoken?{%22email%22:%[email protected]%22} 

最好的办法是DESCRIPT查询的URI的部分,你可以把JSON的另一种方式。成URL参数,并解析URL编码服务器端的符号。

+0

这种方式缺乏URL清洁。电子邮件地址的字母会使您的URL变得混乱,因此不太RESTful。而且,解析URL代码在这里没有任何关系,在大多数框架中这通常是透明的,Flask不应该是例外 – Alexander

+0

没错,只是没有想过。我编辑了一个答案。 – Arkady

+0

@Alexander,REST的目标之一是查询参数中的关键值对,这就是为什么我认为有可能在其中包含JSON。或者我错了?至少我在某处看过它。 – Arkady

2

我怀疑你要追加jsonData作为查询参数。为了这样做,你不需要编码。

$.ajax({ 
    ... 
    data: jsonData, 
    ... 
}); 

你结果URL会就像

http://someserver/sessions/123abc?email=foo%40bar.com 
+0

这种方式并非如此RESTful – Arkady

+0

没错。我第一次尝试使用RESTful API时,我已经明白资源应该被标识为sessiontoken。我将通过比较令牌和电子邮件来检查令牌的有效性。而电子邮件的地方不应该在uri中,而是通过例如JSON。 –