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,那么这是正确的答案。如果我能投更多的票,我会的!!!