(编辑: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;
});
}
第一个问题是我遇到Typescript错误:
'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网站上看到的那样,该符号应该只是告诉用户它是可选的?
我也尝试使用所有字段,不带和带?分数
编辑
this.http.post(url).map(resp => console.log(resp));
Typescript编译器告诉您映射不存在,因为它不是Observable的一部分
我也试过了
import { Response } from "@angular/http";
this.http.post(url).post((resp: Response) => resp)
它可以编译,但是得到了不受支持的媒体类型响应。这些解决方案应适用于“ Http”,但不适用于“ HttpClient”。
编辑2
@Supamiu解决方案也得到了不受支持的媒体类型,因此标题中将出现错误。因此,上面的第二个解决方案(具有Response类型)也应该起作用。但从个性上来说,我认为这不是将“Http”与“ HttpClient”混合使用的好方法,因此我将保留Supamiu的解决方案
您可以观察到完整的响应,而不仅仅是内容。为此,您必须传递observe: response
到options
函数调用的参数中。
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);
});
( 编辑: VS 代码;打字稿: 2.2.1 ) 目的是获取请求响应的头 假设服务中有一个HttpClient的POST请求 HttpClient Angular文档 第一个问题是我有一个打字稿错误: 实际上,当我转到post()方法的ref时,我指向这个原型(我使用VS代码) 但是我想要这个重载的方法: 所以,我试着用这个结构来修复这个错误: 它编译!但我只是以json格式获取正文请求。 再进一
问题内容: 好的,因此我可以使用访问HTTP ajax响应标头 但似乎没有日期,尽管它在那里: 而代码只显示了这一点: 这是ajax调用: 有没有办法可以在响应头中获取日期? 问题答案: 这有帮助:
问题内容: 我正在使用RestTemplate.postForObject将信息发布到Web服务。除了结果字符串,我还需要响应头中的信息。有什么办法可以做到这一点? 问题答案: 好吧,我终于明白了。交换方法正是我所需要的。它返回包含完整标头的HttpEntity。
问题内容: 我正在使用OkHttp客户端和Jackson的Retrofit进行Json序列化,并想获取响应的标头。 我知道我可以扩展OkClient并拦截它。但这是在反序列化过程开始之前进行的。 我基本上需要的是将标头与反序列化的Json Object一起使用。 问题答案: 在Retrofit 1.9.0中,如果您使用接口的回调异步版本, 然后您的回调将收到一个对象 其中有一个方法叫做 对于Ret
问题内容: 我正在尝试阅读文档,我必须承认这并非易事。我没有问题(添加Access-Control-Allow- Origin标头后)来读取responseText,但是除了Firefox之外,其他任何地方都无法获得响应头。 因此,我的问题是使用跨域Ajax获取响应标头的正确方法是什么? 我尝试使用(Access-Control-Expose- Headers ),但是再次失败,无法读取标头。 问
问题内容: 有什么方法可以获取原始响应的HTTP标头? 该方法对我不起作用,因为服务器吐出了多个“ Set-Cookie”,其中一些丢失了。 问题答案: 该方法对我不起作用 您是在的情况下问这个的吗?不可以,无法使用原始HTTP响应标头。您需要退回到低级的Socket编程。这是一个SSCCE,只需复制“ 粘贴 ”即可运行它。 为了避免每个尝试此代码片段的人都使SO过载,输出如下所示: 要了解有关以