当前位置: 首页 > 知识库问答 >
问题:

Angular 4.3.3 HttpClient:如何从响应的标头中获取值?

许焕
2023-03-14

( 编辑: VS 代码;打字稿: 2.2.1 )

目的是获取请求响应的头

假设服务中有一个HttpClient的POST请求

import {
    Injectable
} from "@angular/core";

import {
    HttpClient,
    HttpHeaders,
} from "@angular/common/http";

@Injectable()
export class MyHttpClientService {
    const url = 'url';

    const body = {
        body: 'the body'
    };

    const headers = 'headers made with HttpHeaders';

    const options = {
        headers: headers,
        observe: "response", // to display the full response
        responseType: "json"
    };

    return this.http.post(sessionUrl, body, options)
        .subscribe(response => {
            console.log(response);
            return response;
        }, err => {
            throw err;
        });
}

HttpClient Angular文档

第一个问题是我有一个打字稿错误:

'Argument of type '{ 
    headers: HttpHeaders; 
    observe: string; 
    responseType: string;
}' is not assignable to parameter of type'{ 
    headers?: HttpHeaders;
    observe?: "body";
    params?: HttpParams; reportProgress?: boolean;
    respons...'.

Types of property 'observe' are incompatible.
Type 'string' is not assignable to type '"body"'.'
at: '51,49' source: 'ts'

实际上,当我转到post()方法的ref时,我指向这个原型(我使用VS代码)

post(url: string, body: any | null, options: {
        headers?: HttpHeaders;
        observe?: 'body';
        params?: HttpParams;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<ArrayBuffer>;

但是我想要这个重载的方法:

post(url: string, body: any | null, options: {
    headers?: HttpHeaders;
    observe: 'response';
    params?: HttpParams;
    reportProgress?: boolean;
    responseType?: 'json';
    withCredentials?: boolean;
}): Observable<HttpResponse<Object>>;

所以,我试着用这个结构来修复这个错误:

  const options = {
            headers: headers,
            "observe?": "response",
            "responseType?": "json",
        };

它编译!但我只是以json格式获取正文请求。

再进一步,为什么我必须放一个?字段名称末尾的符号?正如我在Typescript网站上看到的那样,这个符号应该只是告诉用户它是可选的?

我还尝试使用所有字段,没有 和 有 ?标志着

编辑

我尝试了Angular 4提出的从API响应获取头的解决方案。对于地图解决方案:

this.http.post(url).map(resp => console.log(resp));

Typescript编译器告知map不存在,因为它不是Observable的一部分

我也试过这个

import { Response } from "@angular/http";

this.http.post(url).post((resp: Response) => resp)

它编译,但我得到一个不受支持的媒体类型响应。这些解决方案应该适用于“Http”,但它不适用于“客户端”。

编辑2

我还通过@Supamiu解决方案得到了一个不支持的媒体类型,所以它将是我的头上的一个错误。所以上面的第二个解决方案(带有响应类型)应该也可以。但是personnaly,我不认为把“Http”和“HttpClient”混在一起是个好办法,所以我会保留Supamiu的解决方案

共有3个答案

邢冷勋
2023-03-14

事实上,主要问题是打字稿问题。

在post()的代码中,选项直接在参数中声明,因此,作为“匿名”接口

解决方案是直接将选项放在参数中

http.post("url", body, {headers: headers, observe: "response"}).subscribe...
桑坚成
2023-03-14

类型转换的主要问题,所以我们可以使用“响应”作为“身体”

我们可以处理像

const options = {
    headers: headers,
    observe: "response" as 'body', // to display the full response & as 'body' for type cast
    responseType: "json"
};

return this.http.post(sessionUrl, body, options)
    .subscribe(response => {
        console.log(response);
        return response;
    }, err => {
        throw err;
    });
申屠涛
2023-03-14

您可以观察完整的响应,而不仅仅是内容。为此,您必须将<code>observe:response参数中。

http
  .get<MyJsonData>('/data.json', {observe: 'response'})
  .subscribe(resp => {
    // Here, resp is of type HttpResponse<MyJsonData>.
    // You can inspect its headers:
    console.log(resp.headers.get('X-Custom-Header'));
    // And access the body directly, which is typed as MyJsonData as requested.
    console.log(resp.body.someField);
  });

请参见HttpClient的文档

 类似资料:
  • 问题内容: (编辑:VS代码;打字稿:2.2.1) 目的是获取请求响应的标头 假设服务中具有HttpClient的POST请求 第一个问题是我遇到Typescript错误: 确实,当我转到post()方法的ref时,我指出了这个原型(我使用VS代码) 但是我想要这个重载的方法: 因此,我尝试使用此结构修复此错误: 并编译!但是我只是得到json格式的主体请求。 此外,为什么我必须放一个?字段名称末

  • 问题内容: 我正在使用RestTemplate.postForObject将信息发布到Web服务。除了结果字符串,我还需要响应头中的信息。有什么办法可以做到这一点? 问题答案: 好吧,我终于明白了。交换方法正是我所需要的。它返回包含完整标头的HttpEntity。

  • 问题内容: 好的,因此我可以使用访问HTTP ajax响应标头 但似乎没有日期,尽管它在那里: 而代码只显示了这一点: 这是ajax调用: 有没有办法可以在响应头中获取日期? 问题答案: 这有帮助:

  • 我正在尝试从Laravel中的请求访问自定义标头。标题名为“从访问_”。列出Laravel中的所有标题,只会给出“标准标题”,但我设置的标题不在列表中。在“浏览器网络”选项卡中,我可以看到标头已发送。所以我想知道如何从Laravel内部访问它。 我使用Angular2使用默认的超文本传输协议服务发出请求。

  • 我收到了以下回复:HTTP/1.1 200确定日期:2016年4月11日星期一10:36:10 GMT内容处置:附件;filename=结果。xml;x-xss-防护:1;mode=access Keep Alive:timeout=5,max=100我想从头文件中读取文件名,如何使用正则表达式捕获这个值?

  • 问题内容: 我正在使用OkHttp客户端和Jackson的Retrofit进行Json序列化,并想获取响应的标头。 我知道我可以扩展OkClient并拦截它。但这是在反序列化过程开始之前进行的。 我基本上需要的是将标头与反序列化的Json Object一起使用。 问题答案: 在Retrofit 1.9.0中,如果您使用接口的回调异步版本, 然后您的回调将收到一个对象 其中有一个方法叫做 对于Ret