【问题标题】:How to get 'getJSON' response header如何获取“getJSON”响应标头
【发布时间】:2013-03-01 09:35:29
【问题描述】:

我需要使用 $.getJSON 访问从另一台机器(跨域请求)获得的响应消息的大小,虽然我可以在 chrome 控制台中看到请求和响应,但它不起作用。这是我的请求代码:

xhr=$.getJSON('http://192.168.1.102/server/server.php?callback=?',   
{data:array}, function(res){
alert(xhr.getAllResponseHeader());
}, 
type='json'); 

运行时出现“Uncaught TypeError: Object # has no method 'getAllResponseHeader'”错误。当我使用

alert(xhr.getResponseHeader("Content-Length"));

我得到“空”。

请考虑我使用的是跨域获取。

【问题讨论】:

  • 正确的方法名是getAllResponseHeaders
  • 对于跨域,它可能使用JSONP。他们的医生说However, since JSONP and cross-domain GET requests do not use XHR, in those cases the jqXHR and textStatus parameters passed to the success callback are undefined.
  • 1- @Andrei :谢谢你的“s”,当我提醒 xhr.getAllResponseHeaders();它什么也不返回,甚至不返回null。
  • 你在 res 中得到什么了吗?
  • @HungryCoder 那么解决方案是什么?我们可以在javascript和php中自己计算bts吗?

标签: javascript rest jquery


【解决方案1】:

不要使用 JSONP,它不是真正的跨域请求 (JSONP explained),它是一种仅适用于 GET 请求的 hack,而 AJAX 允许任何 http 方法。

尝试准备您的服务器以允许跨域请求 (more details) 并执行以下操作:

$.ajax({
type: "get",
url: "http://192.168.1.102/server/server.php",
crossDomain: true,
cache: false,
dataType: "json",
contentType: "application/json; charset=UTF-8",
data: array,
success: function(data, textStatus, xhr) {
    console.log(data);
    console.log(xhr.getResponseHeader("Content-Length"));
},
error: function (xhr, textStatus, errorThrown) {
    console.log(errorThrown);
}});

这样,xhr 对象就设置好了,你就可以访问它的标题了。

【讨论】:

  • 感谢 vhtc,我会尽快尝试。我也可以使用这种方法进行 POST 吗?我用的是 Apache Tomcat,可以吗?
  • 你可以发出任何类型的http请求。
  • 在服务器端,您需要在响应中添加 Access-Control-Allow-Origin 标头。
  • 非常感谢你希望我能做到明天。我会告诉你结果。我已经在 php 端添加了 Accecc-control-allow-origin。非常感谢
  • 嗨 vhtc,我试过了,但遇到了困难。这是服务器代码。 header("内容类型:应用程序/json"); header("访问控制允许来源:*"); header("访问控制请求方法:GET,POST");在客户端我复制了你的代码。但是,在控制台中抛出错误。这是错误: OPTIONS 192.168.1.102/server/server.ph…ed=&undefined=&undefined=&undefined=&undefined=&undefined=&_=1363329485854 send p.extend.ajax callJSON (anonymous function) p.event.dispatch g.handle.h errorThrown 我保留了 ajax在 callJSON() 函数中重复 30 次。那么,哪里错了?请帮助 tnx。
【解决方案2】:

试试这个:

xhr=$.getJSON('http://192.168.1.102/server/server.php?callback=?',   
  {data:array}, function(res,status,xhr){
    alert(xhr.getAllResponseHeaders()); 
    // not getAllResponseHeader its only getResponseHeader
});

cross domain使用

$.ajax({
  url: 'http://192.168.1.102/server/server.php?callback=?',
  dataType: 'json',
  jsonpCallback: 'MyJSONPCallback', // specify the callback name if you're hard-coding it
  success: function(data){
    // we make a successful JSONP call!
  }
});

参考这个jQuery getJSON works locally, but not cross domain

getAllResponseHeadersgetResponseHeaderajax http://api.jquery.com/jQuery.ajax/ 的文档

【讨论】:

  • 感谢 Rohan,我有一个索引数组要发送给服务器。如果我发送数据是可以的:数组。当我这样做时,请求标头充满了 undefined=&...server/server.php?callback=callback&undefined=&undefined=&undefined=&undefined。我想我的数据应该是键/值的形式,所以我做了 data:{1:123} 并发送了,但我从未收到任何回复。
  • 第一个代码块令人困惑:它使用getAll...,但注释说不要使用它。
【解决方案3】:

我观察到很多人访问了这个问题,并认为提供这个问题的解决方案是件好事。不幸的是,所提供的解决方案都不起作用,我做了两件事来解决这个问题。

  1. 我确认我在服务器端的<?php 标记之后有以下代码:

    header("Content-Type: application/*");
    header("Access-Control-Allow-Origin :*");
    header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
    header("Access-Control-Max-Age: 1000");
    header("Access-Control-Allow-Headers: Content-Type");
    
  2. 我稍微改变了拨打电话的方式,如下所示,它总是对我有用。

    function name(){
        $.ajax({
            type: 'POST',
            crossDomain: true,
            data: {
                data1: data
            },
            dataType: 'text',
            error: function (res, textStatus, errorThrown) {
                alert('Connection Terminated. Please try again');
            },
            success: function(res, textStatus, jqXHR) {
            //Process the result in res;
            },
        });//ajax
    }//function name
    

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 2016-09-21
    • 1970-01-01
    • 2020-08-06
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多