代码之家  ›  专栏  ›  技术社区  ›  markhellewell

jquery get json回调不起作用-即使使用有效的json也不起作用-并且似乎在使用“option”请求而不是“get”

  •  4
  • markhellewell  · 技术社区  · 16 年前

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

    查看服务器日志时,我发现jquery正在执行 getJSON 每3秒调用一次(使用javascript setinterval)。它似乎使用了选项请求,但我已确认使用 curl 对于这些请求类型仍然返回JSON。

    问题是 console.log() 下面jquery中的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 -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 从服务器上得到的数据与get(应用程序的内容类型/json等)完全相同。

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

    4 回复  |  直到 16 年前
        1
  •  3
  •   Christian C. Salvadó    16 年前

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

    我建议你安装 Firebug 并检查您的代码是否正在抛出 权限被拒绝 异常当请求开始时,如果是这种情况,请转到jsonp…

        2
  •  1
  •   Terence Honles    16 年前

    将URL更改为:

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

    然后,在Django视图中,结果应该具有以下效果:

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

    …可能有很多方法可以做到最后一行,但是 基本上是在回调参数中读取(或根据需要命名它)

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

        3
  •  1
  •   markhellewell    16 年前

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

    我通过创建一个小的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
    

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

        4
  •  0
  •   thedz    16 年前

    您正在从另一个域获取JSON吗?如果是这样,您很可能会遇到跨域问题。您需要使用jsonp。jquery会自动执行此操作,但服务器需要知道这一点。

    见:

    http://www.ibm.com/developerworks/library/wa-aj-jsonp1/