JSONP请求的麻烦

时间:2010-06-25 15:52:14

标签: php jquery json cross-domain jsonp

好吧,我不是100%肯定我在这里做错了什么。也许我只需要第二双眼睛来揭示我的方式的错误。我正在使用jQuery从一个域(https://customerhub.net)向我的域(https://dankennedy.com)上的PHP脚本发送JSONP请求,并从该脚本获取响应。我知道请求正在运行,因为出于测试目的,我在发送响应之前将所有输入打印到文件中并且数据正在通过。但是,无论出于何种原因,回调函数都无法正常工作。

这是jQuery代码:

jQuery('#form1').validationEngine({
 failure: false,
 success: function(){
  var url = 'https://dankennedy.com/test2.php?jsoncallback=?';
  jQuery.getJSON(url, jQuery('#form1').serialize(), function(){
   alert('I ran... for once');
  });

  return false;
 }
});

这是PHP代码:

$callback = $_REQUEST['jsoncallback'];

$myFile = "info.txt";
$fh = fopen($myFile, 'w') or die("can't open file");

$data = '';
foreach( $_REQUEST as $key => $value )
 $data .= ", `".$key."` = \"".$value."\"";

$stringData = 'Array: ' . substr( $data, 1 );

fwrite($fh, $stringData);

$response = array( 'msg' => 'SUCCESS' );

$fullResponse = $callback.'('.json_encode($response).')';

fwrite($fh, "\n".$fullResponse );

fclose($fh);

header( 'Content-type: text/plain' );
echo $fullResponse;

最终我会对代码做更多的工作,并让我的PHP脚本访问我的数据库并发回一些有意义的数据,并让我的jQuery函数对该数据进行一些处理。现在,我只是打印出来并从小处开始,以确保通过JSONP进行信息交换。

一切看起来都不错。我也在关注Firebug中的代码,看看代码是如何处理的。正在发出请求,但里面的警报声明没有运行。

正在写入的文件正在打印出来:

Array 5:  `jsoncallback` = "jsonp1277479829087", `id` = "", `type` = "blog", `task` = "add", `title` = "Brace Ford", `date` = "June 25, 2010 11:30 AM", `author` = "", `teaser` = "Teaser", `body` = "Body", `download` = "", `comments` = "", `__utma` = "119149980.718135870.1277328038.1277328038.1277386321.2", `__utmz` = "119149980.1277328038.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)", `SESS6c0bc6ae4aee7e8c564bc45425742fc0` = "tpc7lmtv551kg1vpuvo2c9efi1", `__utmv` = "119149980.authenticated user,s1a", `mifge` = "DKFrontPage", `__utmc` = "119149980"
jsonp1277479829087({"msg":"SUCCESS"})

知道我的严重错误是什么吗?

2 个答案:

答案 0 :(得分:0)

您将无法在FireBug中调试getJSON成功函数代码,但这是预期的。您应该看到的内容(如果您查看FireBug中的源代码)是在html头中注入的脚本标记。这是否正确发生? 并尝试这样做以查看响应是否通过 - 从服务器返回一个字符串,例如“alert('test')”:

$fullResponse = 'alert("test")';
echo $fullResponse;

警报是否会触发?

答案 1 :(得分:0)

我弄清楚问题是什么。无论出于何种原因,我应该使用的回调是“JSONcallback”而不是“jsoncallback”。考虑到查尔斯的想法以及我在另一个论坛上发现的关于将“JSON”资本化的建议,我想我会试一试。工作就像一个魅力。谢谢你的帮助!