Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 浏览器中存在响应标头,但未由$http Response.headers()解析_Javascript_Angularjs_Http_Http Headers_Httpresponse - Fatal编程技术网

Javascript 浏览器中存在响应标头,但未由$http Response.headers()解析

Javascript 浏览器中存在响应标头,但未由$http Response.headers()解析,javascript,angularjs,http,http-headers,httpresponse,Javascript,Angularjs,Http,Http Headers,Httpresponse,在Angular应用程序中,我们需要解析大约$http的响应头 特别是,我们需要解析一些带有X前缀的响应头,例如X-Total-Results:35 打开浏览器开发工具的Network选项卡并检查与$http请求相关的资源,我验证了响应头X-Total-Results:35是否存在 在浏览器中,X-Total-Results标头可用,但无法在$http中解析 有没有一种方法可以在$http中访问“原始”响应并为标头编写自定义解析器 $http.({method: 'GET', url: apiU

在Angular应用程序中,我们需要解析大约$http的响应头

特别是,我们需要解析一些带有X前缀的响应头,例如
X-Total-Results:35

打开浏览器开发工具的
Network
选项卡并检查与$http请求相关的资源,我验证了响应头
X-Total-Results:35
是否存在

在浏览器中,X-Total-Results标头可用,但无法在$http中解析

有没有一种方法可以在$http中访问“原始”响应并为标头编写自定义解析器

$http.({method: 'GET', url: apiUrl,)
    .then( function(response){
        console.log('headers: ', response.headers());
        console.log('results header: ', response.headers('X-Total-Results'));
        // ...
    })
控制台输出

headers: Object {cache-control: "no-cache="set-cookie"", content-type: "application/json;charset=utf-8"}

results header: null

使用$httpProvider.interceptors您可以拦截请求和响应

比如说

$httpProvider.interceptors.push(['$q', '$injector', function ($q, $injector) {
             return {
                 'responseError': function (response) {
                     console.log(response.config);
                 },
                 'response': function (response) {
                     console.log(response.config);
                 },
                 'request': function (response) {
                     console.log(response.config);
                 },
             };
         }]);
更新:您可以在呼叫本身中检索标题信息

$http.({method: 'GET', url: apiUrl)
    .then( (data, status, headers, config){
        console.log('headers: ', config.headers);
        console.log('results header: ', config.headers('X-Total-Results'));
        // ...
    })

您不能在JavaScript上读取头,但可以在开发人员控制台上查看它的原因是,对于CORS请求,您需要允许客户端读取头

您的服务器需要发送此标头:

Access-Control-Expose-Headers:X-Total-Results

为了回答您在评论中的问题,
Access Control Allow Headers
不允许通配符,根据

响应对象在$http回调中可用:
$http()。然后(函数(响应){//response object available here})
问题是它没有解析我感兴趣的结果头--请参见问题。您的更新代码有问题,您的意思是。成功(函数(数据、状态、头、配置){})?这很奇怪,您是否有任何拦截器可能正在修改返回的承诺?否,我没有interceptor@yvesmancera我也觉得很奇怪!如果标题在dev工具浏览器中可见,则意味着它应该可以在angular中访问,对吗?或者CORS或类似问题可能仍然存在一些问题?api是跨域访问的,我有CORS,我会用其他标题更新这个问题。既然你提到了CORS,这肯定是你的问题:谢谢,我会试试的。现在我有
accesscontrolallowheaders:X-Total-Results
当然还有
accesscontrolalloworigin:
这就解决了问题。不过这很有趣,我认为开发人员控制台是一个客户端。。。。仅凭猜测,我会期望类似于运行在同一浏览器中的angular/javascript客户端。。。很明显,我遗漏了一些东西。你也可以在开发者工具上查看HTTPOnly cookies,而在JavaScript上看不到它们。为了节省我的时间,我有一个Cors Toggle chrome插件,因此我只能看到几个标题。