我无法在Angular 5中发出接受text/plain
作为回复的POST请求。 Angular正在调用一个方法,该方法期望JSON
作为响应,因此在尝试解析响应时响应时会抛出错误。
我尝试使用参数{responseType: 'text'}
调用方法,但是VS代码将其显示为错误,并且在编译应用程序时我也在控制台中收到错误。
以下是POST请求的Angular 5代码,该请求要求响应为text/plain
。
this.http
.post<string>(this.loginUrl, this.user, {responseType: 'text'}) // error in this line
.subscribe(
(data) => this.success(data),
(error) => this.failure(error)
);
编译时,控制台中显示以下错误:
ERROR in src/app/login/login.component.ts(47,47): error TS2345: Argument of type '{ responseType: "text"; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: Ht...'.
Types of property 'responseType' are incompatible.
Type '"text"' is not assignable to type '"json"'.
答案 0 :(得分:14)
post
接受responseType:'text'
的版本不通用,因为结果类型已经明确(即string
)
this.http
.post(this.loginUrl, this.user, {responseType: 'text'}) // no generic parameter
.subscribe(
(data) => this.success(data), // data is string
(error) => this.failure(error)
);
答案 1 :(得分:7)
删除<string>
或其他类似解决方案是很容易的事情,我不建议将其用于生产。
这是一种更好的方法:
const httpOptions = {
headers: new HttpHeaders({
'Accept': 'text/plain, */*',
'Content-Type': 'application/json' // We send JSON
}),
responseType: 'text' as 'json' // We accept plain text as response.
};
return this.http.post<string>(this.setBaseUrl, body, httpOptions);
根据您要接收的数据,用valid responseType替换text
。
答案 2 :(得分:2)
只需从您的请求中删除字符串。 就这样写代码。
this.http.post(this.loginUrl, this.user, {responseType: 'text'}).subscribe(
(data) => this.success(data),
(error) => this.failure(error));
答案 3 :(得分:0)
this.http.post(this.loginUrl,this.user,{headers:
new HttpHeaders({'content-type':'application/json'}), responseType:'text'})
.subscribe((r)=>{console.log(r)})
修改
很奇怪,但是像下面的代码片段一样单独创建标头对象
let headerOptions = {
headers: new HttpHeaders(
{'content-type':'application/json'}),
responseType:'text'
}
this.http.post(this.loginUrl,this.user, headerOptions)
.subscribe((r)=>{console.log(r)})
在VS代码中会引发错误,因此我们的想法是像上述那样在内联的post请求中传递整个对象将解决编译错误。
答案 4 :(得分:0)
我本人今天才遇到这个特殊问题。经过一些搜索并确定了responseType选项应该存在之后,我设法使其工作如下:
let requestOptions: Object = {
headers: new HttpHeaders().set('Authorization', 'Basic ' + credentials),
responseType: 'text'
}
return this.httpClient.get<any>(
this.environment.tokenHost + this.environment.authenticationURL,
requestOptions
)
.subscribe(result => {
// do stuff
});
与在“请求”本身中进行配置相比,像这样设置responseType
使其可以工作。
致谢。