我有一个表单设置,它将从用户那里获得一些输入,并通过jQuery的.ajax()
函数将其发布到URL。 URL位于一个单独的子域中,但我已经设置了CORS,并且一切正常。
服务器端验证表单会发生什么情况,如果检测到错误(表单中的错误填写不正确),我会传回以下JSON:
{"success": "false", "error": "Whatever the error is"}
这对我有用,所以我知道一般设置是正确的。
当表单有效时,我执行数据库查询以检索一堆文件的详细信息,将其作为数组接收,并将所有这些作为JSON和成功消息传回。此方案的JSON遵循:
{"success": "true", "files": [{"id":"4","file_name":"data_zones_scotland_2001.csv","nice_name":"Data Zone - Scotland","description":"","type":"1","coverage":"Scotland","distribution":"public","pack_type":"LSOAs, MSOAs, Data Zones, Intermediate Zones","link":"https:\/\/s3-eu-west-1.amazonaws.com\/data_zones_scotland_2001.csv?Expires=1396528176&Signature=V8ojfXhoH5eggIjwix265KGbr0M%3D"},{"id":"8","file_name":"intermediate_zones_scotland_2001.csv","nice_name":"Intermediate Zone - Scotland","description":"","type":"1","coverage":"Scotland","distribution":"public","pack_type":"LSOAs, MSOAs, Data Zones, Intermediate Zones","link":"https:\/\/s3-eu-west-1.amazonaws.com\/intermediate_zones_scotland_2001.csv?Expires=1396528176&Signature=ieaZYnZCz%2BpnJmWLeq5ygpJ9zNM%3D"}]}
长串的道歉,但我想在那里得到它,以防我错过了什么。
我遇到的问题是,当我将其传回时,我收到No 'Access-Control-Allow-Origin' header is present on the requested resource
错误。我知道情况并非如此,我已经测试了使用curl -i http://url...
设置的标头。取出文件数组并返回{"success": "true"}
工作正常,这表明文件数组中的JSON格式错误,但是通过JSONLint传递该字符串告诉我JSON是有效的。
由于我所做的一切似乎都是正确的,我对于下一步转向下一步的想法已经不多了。处理POST的jQuery代码如下:
$.ajax({
url: "http://domain.com/api/download-request",
type: "POST",
data: postData,
dataType: 'json'
})
.done( function(data){
console.log(data);
});
我很欣赏任何有关下一步转向的线索。
*更新* 为了解决这个问题,我开始过滤从数据库收到的数据,认为字符串中有一些东西打破了输出。我得到了一个点,我似乎已经通过限制返回的记录数量将其缩小到特定记录,直到它破裂。检索只是此记录后,它再次有效。我坚持了下来,然后注意到当JSON字符串达到一定长度(大约600个字符)时会产生错误。
我已经进入php.ini尝试在那里找到一个限制,一旦我将output_buffering
的大小从4096增加到8192(加倍),整个事情开始起作用。我应该提一下,DB的输出没有URL,大大缩短了字符串的长度,所以一旦我在应用程序中添加这些后再次破坏,直到我将缓冲区增加到16384(再次加倍)。
现在应用程序正常运行,但这显然不是最好的做事方式。有没有一种方法可以动态设置output_buffering或改变echo的工作方式,以便PHP不会用完缓冲区?
答案 0 :(得分:0)
使用JsonP代替json。
$.ajax({
url:"testserver.php",
dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
success:function(json){
// do stuff with json (in this case an array)
alert("Success");
},
error:function(){
alert("Error");
}
});
同时,您可能需要使用回调函数包装数据,只是为了表示jsonp数据。 请查看此链接以获取有关如何执行此操作的详细信息:allow cross domain ajax requests
REF:
快乐编码:)
答案 1 :(得分:0)
问题是输出缓冲区变满了。增加缓冲区的大小或关闭缓冲区可以解决这个问题。