EDITED可以查看JSON响应200 OK但返回parsererror

时间:2013-03-19 15:12:40

标签: javascript ajax json cordova getjson

我可以得到以下字符串

([{"data":{"Rate":"","RoleA":"Student","NameA":"student","RoleB":"Tutor","NameB":"tutorB","Give":"0","Get":"1","Accept":"0"}}]);

我从http://api.jquery.com/jQuery.ajax/读过,但仍不确定我在哪里做错了。

这是我的代码

            $.ajax({
                        type:           'GET',
                        dataType:       'jsonp',
                        jsonpCallback:  'jsoncallback',
                        data: 
                        {

                                nameB:  nameB,
                                roleB:  roleB,
                                get123: get123,
                                accept: accept
                        },
                        url: 'http://mydomain.com/check.php?callback=?',
                        success: function(data){
                            alert(data[0].data.RoleA);
                            //alert("ABC");
                            //if ( $("#role").text() == "Tutor" )
                            //{
                            //  window.location.href='tutor_home.html';
                            //}
                            //else
                            //{
                            //  window.location.href='student_home.html';
                            //}         
                        },
                        error: function(jqXHR, textStatus){
                            alert("Request failed: " + textStatus);
                        }
            });

从chrome,我可以找到json字符串,看起来很正常。但是,它不会提示成功消息,而是警告parsererror错误..我应该在哪里更改?感谢

我的php

<?php 

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Content-type: application/json");

include('mysqlConfig.php');


$nameB = $_GET["nameB"];
$roleB = $_GET["roleB"];
$get = $_GET["get123"];
$accept = $_GET["accept"];

$sql="SELECT * FROM tbl_rating WHERE NameB='$nameB' and RoleB='$roleB' and Get='$get' and Accept='$accept'";
$result=mysql_query($sql);


$rows = array();

//retrieve and print every record
while($r = mysql_fetch_assoc($result)){
    // $rows[] = $r; has the same effect, without the superfluous data attribute
    $rows[] = array('data' => $r);
}

// now all the rows have been fetched, it can be encoded
//echo json_encode($rows);

$data = json_encode($rows);
echo $_GET['jsoncallback'] . '(' . $data . ');';
?>

我不确定为什么网址如下 请求网址: http://mydomain.com/check.php?callback=jsoncallback&nameB=tutorB&roleB=Tutor&get123=1&accept=0&_=1363710513593

最后一个参数&_=1363710513593我不确定它是什么?

但它可以返回上面的字符串

它与jquery版本有关吗?我使用了jquery-1.9.1.min.js

3 个答案:

答案 0 :(得分:3)

您需要在ajax设置对象中指定一个回调名称(现在称为“?”)。在http://api.jquery.com/jQuery.ajax/上详细了解其工作原理。在设置对象中查找“jsonp”。您还需要在PHP代码中获取该回调名称并将其返回到响应中,以便在将该函数接收到客户端时执行该函数。 示例:jsoncallback(YOURJSONDATA)。

http://api.jquery.com/jQuery.ajax/

粘贴

JSONP 类型:字符串 覆盖jsonp请求中的回调函数名称。在'callback =?'中将使用此值代替'callback' url中查询字符串的一部分。所以{jsonp:'onJSONPLoad'}会导致'onJSONPLoad =?'传递给服务器。从jQuery 1.5开始,将jsonp选项设置为false可防止jQuery将“?callback”字符串添加到URL或尝试使用“=?”转型。在这种情况下,您还应该显式设置jsonpCallback设置。例如,{jsonp:false,jsonpCallback:“callbackName”}

答案 1 :(得分:1)

更新:您显示您的服务未返回正确的jsonp有效负载 修复它以使用传递的回调名称,因此当您将mycallback作为jsonp回调传递时,您将获得以下响应。

 mycallback([{"data":{"Rate":"","RoleA":"Student","NameA":"student","RoleB":"Tutor","NameB"‌​:"tutorB","Give":"0","Get":"1","Accept":"0"}}]); 

更新2:&_=1363710513593 - 是为了让jquery能够弄清楚对应的jsonp请求是什么而添加到请求中的时间戳,因为jsonp在客户端上的处理方式(即响应来自文本并且是嵌入体内)

您正在访问的json服务支持jsonp,因此您需要配置$.ajax执行jsonp请求并将json回调名称更改为jsoncallback

http://api.jquery.com/jQuery.ajax/

$.ajax({
                type: 'GET',
                dataType : 'jsonp',
                jsonpCallback : 'jsoncallback',
                data: 
                {

                        nameB:    nameB,
                        roleB:    roleB,
                        get123:   get123,
                        accept:   accept
                },
                url: 'http://mydomain.com/check.php',
                success: function(data){
                    alert(data[0].data.RoleA);
                 }       
                },
                error: function(){
                    alert('There was an error.');
                }
            });

            //return false;
        });

答案 2 :(得分:1)

看起来您的服务器正在尝试返回jsonp。尝试添加

dataType: 'jsonp'

到你的ajax请求并删除jsonp callback =?参数

e.g。

 $.ajax({
                type: 'GET',
                dataType: 'jsonp',
                data: 
                {

                        //nameB:    nameB,
                        //roleB:    roleB,
                        //get123:   get123,
                        //accept:   accept
                },
                url: 'http://mydomain.com/check.php?nameB=tutorB&roleB=Tutor&get123=1&accept=0&',
                success: function(data){
                    alert(data[0].data.RoleA);     
                },
                error: function(){
                    alert('There was an error.');
                }
            });

            //return false;
        });