我正在研究这个项目。 我们的想法是使用角度4
从谷歌图书API中检索图书我很难理解如何阅读JSON响应,我还在学习Angular。 我正在网上搜索,并在GitHub上找到了这个源代码 google bookstore
我收到以下错误
Argument of type 'Response' is not assignable to parameter of type 'string'.
这一行
let bookResponse = JSON.parse(body);
我不确定我是否采用正确的方法。 感谢您的帮助
下面是我发送HTTP请求的方法。
getBooks(searchparam: any){
let par = new HttpParams();
par.set('q', searchparam);
return this.httpClient.get('https://www.googleapis.com/books/v1/volumes', {
params : new HttpParams().set('q',searchparam)
}).map(
(response: Response) => {
let data = response;
return data;
}
);
}
下面是从HTTP请求获取数据并读取JSON响应的方法
getBook() {
const dataArrya = this.searchForm.get('param').value;
console.log(dataArrya);
this.requestService.getBooks(dataArrya)
.subscribe(
response => {
this.printData(response)
// console.log(this.bookData);
},
(error) => console.log(error)
);
}
private printData(res: Response) {
let body = res;
let books: Array<Book> = new Array<Book>();
let bookResponse = JSON.parse(body);
console.log(bookResponse);
console.dir(bookResponse);
for (let book of bookResponse.items) {
books.push({
title:book.volumeInfo.title,
subTitle: book.volumeInfo.subTitle,
categories: book.volumeInfo.categories,
authors: book.volumeInfo.authors,
rating: book.volumeInfo.rating,
pageCount: book.volumeInfo.pageCount,
image: book.volumeInfo.imageLinks === undefined ? '' : book.volumeInfo.imageLinks.thumbnail,
description: book.volumeInfo.description,
isbn: book.volumeInfo.industryIdentifiers,
previewLink: book.volumeInfo.previewLink
});
}
}
答案 0 :(得分:3)
如the reference所述,
responseType值确定如何解析成功的响应正文。如果responseType是默认的json,则结果对象的类型接口可以作为类型参数传递给request()。
HttpClient
get
默认情况下已使用JSON.parse
解析响应,无需再调用两次。
结果是普通对象,而不是Response
(它属于Http
API,并且在未导入时可能与Response
global混淆。
上面提到的repository使用了Angular 2和Http
,而这里的代码并不合适。 HttpClient
是Angular 4中引入的较新的API。Http
和HttpClient
之间的主要实际区别在于后者并不需要将.map(response: Response => response.json())
添加到请求。
答案 1 :(得分:2)
JSON.parse
接受一个字符串,但是你传给它一个Angular Response
,它是一个对象(不是字符串)。要将Angular Response
转换为字符串,您可以在其上调用toString
,如下所示:
let bookResponse = JSON.parse(body.toString());