jQuery GET JSON回调不起作用(即使使用有效的JSON),并且似乎在使用“OPTION”请求而不是“GET”

2024-09-24 22:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

背景是,我有一个芹菜分布式作业服务器,配置了一个Django视图,该视图返回JSON中正在运行的作业的状态。作业服务器位于celleryserver.mydomain.com,我正在从中执行jQuery的页面是www.mydomain.com,因此我不需要考虑JSONP,因为请求不是针对不同的域的,所以我应该考虑JSONP?

通过查看服务器日志,我发现jQuery每3秒执行一次getJSON调用(使用Javascript setInterval)。它似乎确实使用了一个选项请求,但是我已经用curl确认了对于这些请求类型仍然返回JSON。

问题是,下面jQuery中的console.log()Firebug调用似乎从未运行过!getJSON调用之前的那个。没有回拨工作对我来说是个问题,因为我希望用这种方式来调查芹菜的工作状态,并根据工作状态来做各种事情。

<script type="text/javascript">
    var job_id = 'a8f25420-1faf-4084-bf45-fe3f82200ccb';

    // wait for the DOM to be loaded then start polling for conversion status
    $(document).ready(function() {
        var getConvertStatus = function(){
            console.log('getting some status');
            $.getJSON("https://celeryserver.mydomain.com/done/" + job_id,
                function(data){
                    console.log('callback works');
                });
        }
        setInterval(getConvertStatus, 3000);
    });
</script>

我使用curl来确定从服务器接收到的内容:

$ curl -D - -k -X GET https://celeryserver.mydomain.com/done/a8f25420-1faf-4084-bf45-fe3f82200ccb
HTTP/1.1 200 OK
Server: nginx/0.6.35
Date: Mon, 27 Jul 2009 06:08:42 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close

{"task": {"executed": true, "id": "a8f25420-1faf-4084-bf45-fe3f82200ccb"}}

JSON在我看来很好,JSONlint.com现在可以为我验证它。。。我还用-X OPTION模拟了jQuery查询,并从服务器获得了与GET(application/json等的内容类型)完全相同的数据

我已经盯着这个看了很多年了,非常感谢你的帮助。我是一个非常新的jQuery用户,但这看起来应该是非常没有问题的,所以我不知道我做错了什么!


Tags: 服务器comlogidjson状态作业curl
3条回答

正如一些人所说,子域算作域,我有一个跨域问题:)

我通过创建一个Django中间件来解决这个问题,如果视图返回JSON并且请求附加了一个回调,那么该中间件将从我的视图中更改响应。

class JSONPMiddleware:
    def process_response(self, request, response):
        ctype = response.get('content-type', None)
        cback = request.GET.get('callback', None)

        if ctype == 'application/json' and cback:
            jsonp = '{callback}({json})'.format(callback=cback, json=response.content)
            return HttpResponse(content=jsonp, mimetype='application/javascript')
        return response

现在一切都按计划进行。谢谢!

我认为你有一个跨子域的问题,sub.domain.tlddomain.ltd不一样。

我建议您安装Firebug,并检查您的代码在请求启动时是否抛出了Permission denied异常,如果是这样,请转到JSONP。。。

将url更改为以下内容:

https://celeryserver.mydomain.com/done/”+作业id+”?回调=?“

然后在你的django视图上,结果应该是:

'{callback}({json})'.format(callback=request.GET['callback'], json=MyJSON)

…可能有很多方法可以完成最后一行,但是 基本上读入回调参数(或者随意命名)

然后将其返回为调用json对象 (jQuery负责创建回调函数(它替换“?”使用生成的函数)

相关问题 更多 >