Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Angular 角度HttpClient缺少响应头_Angular_Angular6_Angular Httpclient - Fatal编程技术网

Angular 角度HttpClient缺少响应头

Angular 角度HttpClient缺少响应头,angular,angular6,angular-httpclient,Angular,Angular6,Angular Httpclient,我最近正试图进入一个新的领域。 我有一个分页的请求 const myParams=new-HttpParams().set('page',page.toString()).set('size',size.toString()); this.http.get('https://localhost:8443/user/', { headers:newhttpheaders({'Content-Type':'application/json'}), 参数:myParams, 观察:“回应” }).su

我最近正试图进入一个新的领域。 我有一个分页的请求

const myParams=new-HttpParams().set('page',page.toString()).set('size',size.toString());
this.http.get('https://localhost:8443/user/', {
headers:newhttpheaders({'Content-Type':'application/json'}),
参数:myParams,
观察:“回应”
}).suscribe((响应:HttpResponse)=>this.data=response.body);
数据库中元素的总计数在
X-total-count
标题中传输到客户端。我试着这样读:

.suscribe((响应:HttpResponse)=>{
this.data=response.body;
this.totalCount=response.headers.get('X-Total-Count');
});
但这是行不通的。结果表明response.headers只包含真实http响应头的一个子集

这就是headers对象的外观

“标题”:{
“normalizedNames”:{},
“懒散更新”:空
}
我确信已发送X-Total-Count。Firefox开发工具显示了这一点。您能告诉我如何将其纳入回复中吗

更新


这个问题与被确定为重复的问题的不同之处在于:我没有问过如何检查完整的httpResponse。这是我自己想出来的。我一直在问为什么响应的
标题
属性不完整。

CORS请求只公开6个安全列出的标题:
缓存控制
内容语言

内容类型
过期
上次修改
&
Pragma

为了使用CORS请求访问自定义头,服务器必须显式地将它们列为白名单。这可以通过发送响应头来完成:
Access Control Expose Headers

例如:
访问控制公开标题:X-Total-Count,X-Paging-PageSize


尝试将
with credentials:true
添加到http选项对象。

HttpResponse对象中的头是延迟加载的,因此在强制加载值之前,
头将显示为空。尝试调用
response.headers.keys()
以查看所有可用的头名称。顺便说一下,这还强制将所有值加载到映射
响应.headers.headers

中,正如Tsvetan Ganev之前所述,如果这是CORS请求,则需要在
访问控制中按名称显式公开所需的头。要实现这一点,您需要配置应用程序服务器,例如在Spring中使用
WebMVCConfiguer
时,您可以公开如下标题:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                .addMapping("/**")
                .allowedOrigins("*")
                .exposedHeaders("X-Total-Count")
                .allowedMethods("*");
    }
}
使用此配置,您的浏览器除了7个默认标题外:

  • 缓存控制
  • 内容语言
  • 内容长度
  • 内容类型
  • 过期
  • 上次修改的
  • Pragma

也将为您的应用程序公开
X-Total-Count
头。

在我的例子中,Postman能够获取自定义的“授权”头,但Angular没有。我通过显式地公开自定义头解决了这个问题

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    // vvv
    config.addExposedHeader(HttpHeaders.AUTHORIZATION);
    // ^^^
    config.addAllowedMethod(HttpMethod.OPTIONS);
    config.addAllowedMethod(HttpMethod.GET);
    config.addAllowedMethod(HttpMethod.POST);
    config.addAllowedMethod(HttpMethod.PUT);
    config.addAllowedMethod(HttpMethod.PATCH);
    config.addAllowedMethod(HttpMethod.DELETE);
    config.setMaxAge(1800L);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

我很抱歉地通知你,这不是你提到的那篇文章的复制品。如你所见,我使用了你链接的答案中的方法<代码>观察:“响应”
。我的问题是
response.headers
不包含后端发送的所有头。对不起,您是对的!如果您没有使用CORS,那么这是正确的答案。如果我能投更多的票,我会的!!!