0

我正在尝试使用 jQuery 进行跨域调用,但到目前为止非常不成功。我的 HTML 文件位于我的“C:/Temp”文件夹名称“test.html”上。我的 HTML 代码如下——

<!DOCTYPE html> 
<html> 
    <head> 
    <title>My Page</title> 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
</head> 
<body> 
<input id="first_name" type="text" value="khan" />
<input id="clickme" type="button" value="Click Me!"/>

<script type="text/javascript">
    $(document).ready(function() {
        $("#clickme").click(function(){
            $.ajax({
                url: 'http://localhost:8008/qm/profile/' + $("#first_name").val() + "/",
                type: "GET",
                dataType: "jsonp",
                crossDomain : true,
                success: function(response)
                    {
                        alert(response.responseText);
                    },
                error: function()
                    {
                        alert("fail");
                    },
            });
        });
    });

</script>

</body>
</html>

现在在服务器端,我有一个看起来像这样的小 Python 代码——

def profile(request, username):
    fullname = ''
    if username == 'khan':
        fullname = 'Khan Hannan'
    data = {'fullname': fullname}
    print data
    return HttpResponse(json.dumps(data))

python 代码位于 DJango 项目中。如果我直接调用 URL ('http://localhost:8008/qm/profile/khan'),我会从服务器收到 JSON 响应,但是当我通过 jQuery 输入相同的 URL 时,我不会'没有得到任何回应,但它失败了。

有什么建议吗?

4

2 回答 2

0

JSONP 的工作原理是将 JSON 包装在一个函数中,然后执行该函数以获取代码对象。

这是通过向服务器发送一个回调查询字符串值来完成的,然后它假设用它来包装 JSON 对象。

如果您检查发送到您的服务器的请求,您应该会看到一个正在发送的值,称为callback=jquery[long number].

http://en.wikipedia.org/wiki/JSONP

于 2012-09-13T19:44:03.303 回答
0

您需要创建一个 JSONP 回调构造,其中 JSON 返回值被传递给在callback请求参数中命名的回调函数。

Django Snippets 站点有一个方便的 JSONP 装饰器,它会为您处理这个问题,并验证用户是否也已通过身份验证。

如果您不想使用该装饰器,至少callback在您的响应中使用请求参数,并设置正确的内容类型:

return HttpResponse("%s(%s)" % (request.GET['callback'], json.dumps(data)),
    content_type='application/javascript'))
于 2012-09-13T19:53:45.653 回答