2017-10-29 385 views
0

我有這個項目正在處理中。 這個想法是從谷歌書API檢索書籍,使用角度4「響應」類型的參數不能分配給'string'類型的參數

我很努力去理解如何閱讀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 
    }); 
} 

} 
+1

順便說一句,上面的代碼有錯誤。 HttpParams實例是不可變的,'.set'應該被鏈接https://stackoverflow.com/questions/45210406/angular-4-3-httpclient-set-params。這個par.set('q',searchparam)'不起作用。 – estus

+0

感謝Estus,它爲我工作,因爲我只有一個參數,但如果我有更多,那麼這是一個問題。 – OceanWavez

+0

它適用,因爲你在另一個地方有正確的代碼,'params:new HttpParams()。set('q',searchparam)' – estus

回答

0

JSON.parse需要一個字符串的方法,但你傳遞一個Angular Response,這是一個對象(不是字符串)。爲了一個角度Response轉換爲字符串,你可以調用它toString,就像這樣:

let bookResponse = JSON.parse(body.toString()); 
0

由於the reference狀態,

的responseTyp的值決定成功的響應體將如何解析。如果responseType是默認的json,則可以將結果對象的類型接口作爲類型參數傳遞給request()。

HttpClientget已經解析默認使用JSON.parse響應,也沒有必要把它的兩倍。

結果是普通對象,而不是Response(它屬於Http API,在未導入時可能與Response global混淆)。

提到的repository使用Angular 2和Http,那裏的代碼在這裏不適合。 HttpClient是Angular 4中引入的較新API。HttpHttpClient之間的主要實際區別在於後者不需要將.map(response: Response => response.json())添加到請求中。

相關問題