GVKun编程网logo

无法从Ajax getAllResponseHeaders获得自定义HTTP标头响应(无法从该url加载脚本)

21

在本文中,我们将为您详细介绍无法从AjaxgetAllResponseHeaders获得自定义HTTP标头响应的相关知识,并且为您解答关于无法从该url加载脚本的疑问,此外,我们还会提供一些关于aja

在本文中,我们将为您详细介绍无法从Ajax getAllResponseHeaders获得自定义HTTP标头响应的相关知识,并且为您解答关于无法从该url加载脚本的疑问,此外,我们还会提供一些关于ajax – jqXHR.getAllResponseHeaders()不会返回所有标题、ajax – 使用JsonRest Store(dojo)自定义http标头、angularjs – transformResponse headers参数($resource)中缺少自定义响应的标头、asp.net – HttpWebRequestError:服务器提交协议冲突. Section = ResponseHeader Detail = CR必须跟随LF的有用信息。

本文目录一览:

无法从Ajax getAllResponseHeaders获得自定义HTTP标头响应(无法从该url加载脚本)

无法从Ajax getAllResponseHeaders获得自定义HTTP标头响应(无法从该url加载脚本)

我确实获得了响应数据,但是无法获得自定义HTTP标头数据。

是的,这是一个跨域请求。我正在用Javascript执行Ajax请求。我已经尝试过XMLHttpRequest和jQuery $
.ajax。我已经完成了服务器设置,在发送数据时已进行了以下设置:

Access-Control-Allow-Origin: *Access-Control-Allow-Methods: POST, GET

确实 得到了想要的响应数据。但是我无法获得完整的HTTP标头响应。

使用PHP,我在发送文本响应之前设置了以下内容。因此,我假设我应该使用getAllResponseHeaders()获得它。

header(''Expires: 0'');header(''Cache-Control: must-revalidate, post-check=0, pre-check=0'');header(''My-Own-Test: nodatahere'');

但是,这就是我得到的。

Content-Type: text/plain; charset=x-user-definedCache-Control: must-revalidate, post-check=0, pre-check=0Expires: 0

它缺少My-Own-Test。仅供参考,这是我的Javascript:

var formData = new FormData();formData.append(''username'', ''my_username'');formData.append(''book_id'', ''test password'');var xhr = new XMLHttpRequest();xhr.open(''POST'', ''https://mydomain.com/proc.php'', true);xhr.overrideMimeType("text/plain; charset=x-user-defined");xhr.onload = function(e) {     console.log(this.getAllResponseHeaders());};xhr.send(formData);

我什至用jQuery尝试过…同样的结果。

var data_to_send = {    username: ''my_username'',    password: ''test_password''};var ajaxObj;ajaxObj = $.ajax({    url: "https://mydomain.com/proc.php",    data: data_to_send,    type: "POST",     beforeSend: function ( xhr ) {        xhr.overrideMimeType("text/plain; charset=x-user-defined");    }}).done(function ( data ) {    console.log( ajaxObj.getAllResponseHeaders()  );});

仍然…没有运气。

但是,如果我去通过萤火虫或Chrome的开发者工具,我可以看到,这些工具做回完整的HTTP头信息,包括Content-LengthContent-EncodingVaryX-Powered-BySet-CookieServer,当然My-Own-Test

答案1

小编典典

我要感谢jbl向我指出正确的问题。我现在知道了…

好吧,答案。如果您想设置自己的HTTP标头信息,然后使用跨域Ajax或类似的方法来获取它,则在发送响应文本之前,应在服务器端设置一些额外的HTTP标头。

header(''Access-Control-Allow-Origin: *'');header("Access-Control-Allow-Methods: POST, GET");      header(''Custom-Header: Own-Data'');header(''Access-Control-Expose-Headers: Custom-Header'');

上面的示例使用PHP。但是,请使用您自己的语言来设置它们。

当我问这个问题时,除了,我都拥有了其他所有内容Access-Control-Expose-Headers。放入后,我的JavascriptAjax可以读取HTTP标头Custom-Header的内容。

ajax – jqXHR.getAllResponseHeaders()不会返回所有标题

ajax – jqXHR.getAllResponseHeaders()不会返回所有标题

jQuery.ajax()调用后,jqXHR.getAllResponseHeaders()不会返回所有头.服务器回应了以下标题:
Connection: keep-alive
Content-Length: 64
Content-Type: application/json
X-My-CustomHeader: whatever

getAllResponseHeaders()仅返回:

Content-Type: application/json

我究竟做错了什么?

var request = {
  'url': 'http://api.someExternalDomain.com/resource/','type': someMethod,'success': function(data,textStatus,jqXHR) {
    console.log(jqXHR.getAllResponseHeaders());
  }
};

$.ajax(request);
从jquery官网:

At present,due to a bug in Firefox where .getAllResponseHeaders()
returns the empty string although .getResponseHeader(‘Content-Type’)
returns a non-empty string,automatically decoding JSON CORS responses
in Firefox with jQuery is not supported.

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

ajax – 使用JsonRest Store(dojo)自定义http标头

ajax – 使用JsonRest Store(dojo)自定义http标头

我想知道是否有任何方法可以在Get ajax请求(xhr.get)中设置我自己的自定义http标头,该请求会自动执行JsonRest存储.

有一个相关的主题,但没有一个很好的解决方案:
Dojo Data grid with custom HTTP headers

我已经在’dojo.store.JsonRest’中看到了包含构造函数的JsonRest实现,如果我们能够做到或不做(我不这么认为),这一点并不明显.正在使用的JsonRest存储示例:

var store = new JsonRestStore({target: "/Table/" });

解决方法

我将完成它的子类化dojo.store.JsonRest,你可以在 this jsFiddle中看到.

A.子类​​dojo.store.JsonRest:

var MyJsonRest = declare(JsonRest,{

    get: function(id,options) {
        return this.inherited(
            arguments,[id,lang.mixin(this.defaultGetHeaders,options)]
        );
    }
});

所以你重写get方法调用超类’get,但第二个参数选项(即.headers)现在也包含this.defaultGetHeaders的属性.

B.在构造函数中定义defaultGetHeaders:

var myJsonRest = MyJsonRest({
    target: "/echo/json/",defaultGetHeaders: {
        userId: "xyz",requestedBy: "abc",requestedFrom: "123"            
    }        
});

C.调用myJsonRest.get()方法,您也可以覆盖默认标头:

myJsonRest.get("someId",{ requestedFrom: "321"}).then(function(result) {
    console.log(result);        
});

D.检查请求标头:

angularjs – transformResponse headers参数($resource)中缺少自定义响应的标头

angularjs – transformResponse headers参数($resource)中缺少自定义响应的标头

我已经为API端点定义了一个$资源,该端点返回包含多个头的响应,但在 transformResponse配置函数中,headersGetter函数参数中缺少大多数头.

我该如何解决?

API的响应标头

HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Pragma: no-cache
Expires: 0
x-frame-options: DENY
Access-Control-Allow-Origin: http://localhost:9000
access-control-allow-methods: POST,PUT,GET,DELETE,OPTIONS
access-control-allow-headers: Content-Type
Access-Control-Allow-Credentials: true
Content-disposition: attachment; filename="testCall.pcap"
FileName: testCall.pcap
Content-Type: application/pcap

transformResponse的标题

Pragma: no-cache
Content-Type: application/pcap
Cache-Control: no-cache,must-revalidate
Expires: 0
app.factory("MyService",function ($resource,ENV,_) {
    return {
        testCall: $resource(ENV.apiEndpoint + "/test-call",{},{
            launch: {
                method: 'POST',isArray: false,headers:{'Accept':'application/octet-stream'},responseType: 'blob',cache: false,transformResponse: function(data,headers){
                    var filename = headers('Content-disposition'); //headers('FileName')
                    var contentType = headers('Content-Type');

                    var file = new Blob([data],{
                        type: contentType
                    });

                    var fileURL = URL.createObjectURL(file);
                    var a         = document.createElement('a');
                    a.href        = fileURL;
                    a.target      = '_blank';
                    a.download    = filename;
                    document.body.appendChild(a);
                    a.click();
                }
            }
        }),searchOptions: $resource(ENV.apiEndpoint + "//search-options")
    };
});
假设您正在进行CORS调用,响应标头并非全部暴露.服务器端需要在CORS过滤器中添加响应头“Access-Control-Expose-Headers”.

例如要使用CORS调用读取名为“X-MY-HEADER1”和“X-MY-HEADER2”的自定义响应标头,请添加标头

访问控制 – 暴露 – 标题:“X-MY-HEADER1,X-MY-HEADER2”

请参阅@nancoder在https://stackoverflow.com/a/23726352/4684232的答案

asp.net – HttpWebRequestError:服务器提交协议冲突. Section = ResponseHeader Detail = CR必须跟随LF

asp.net – HttpWebRequestError:服务器提交协议冲突. Section = ResponseHeader Detail = CR必须跟随LF

我已经创建了一个示例asp.net应用程序,并尝试使用httpwebrequest从服务器中删除数据.但有些时候我得到这个上面的错误.我在google上做了一些搜索,但都是说你应该添加属性“< httpWebRequest useUnsafeHeaderParsing =”true“/>”在web.config中.

这个属性有’UNSAFE’的字,所以我太担心这个,我不能添加这是在我的网站配置.有什么其他选项来阅读我的scrape URL的回复,请让我知道如何可能没有“< httpWebRequest useUnsafeHeaderParsing =”true“/>”

提前致谢,
Laxmilal Menaria

解决方法

这当然是一个服务器问题 – 服务器不遵循HTTP规范,而.NET客户端将此标记为潜在问题.我觉得“不安全”是一个不正当的词.这里没有一个很大的安全问题,只是不遵守RFC是不好但不幸的是不罕见.

因此,如您在Google中发现的那样,解决问题的方法是应用以下配置更改:

<configuration> 
 <system.net> 
  <settings> 
   <httpWebRequest useUnsafeHeaderParsing="true" /> 
  </settings> 
 </system.net> 
</configuration>

关于无法从Ajax getAllResponseHeaders获得自定义HTTP标头响应无法从该url加载脚本的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ajax – jqXHR.getAllResponseHeaders()不会返回所有标题、ajax – 使用JsonRest Store(dojo)自定义http标头、angularjs – transformResponse headers参数($resource)中缺少自定义响应的标头、asp.net – HttpWebRequestError:服务器提交协议冲突. Section = ResponseHeader Detail = CR必须跟随LF等相关知识的信息别忘了在本站进行查找喔。

本文标签: