1

尝试在 Goodreads API 上搜索书籍信息。同时我正在尝试将数据从 xml 转换为 json。搜索图书时出现此错误

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://localhost:3000 ”。

和警告

跨域读取阻止 (CORB) 阻止了具有 MIME 类型 application/xml的跨域响应https://www.goodreads.com/search/index.xml?key=PL6saHk8cIrLeeLG3eylg&q=halo 。有关详细信息,请参阅https://www.chromestatus.com/feature/5629709824032768 。

我安装了 xml2js 包并将其放入我的函数中,如下所示

searchBooks = async (e) => {
    e.preventDefault();
    const search = this.state.search;
    try {
        let res = await axios.get(
            `https://www.goodreads.com/search/index.xml?key=PL6saHk8cIrLeeLG3eylg&q=${search}`
        );
        let xml = res.data;
        parseString(xml, (error, res) => {
            this.setState({
                books: res.data
            });
        });
    } catch (error) {
        this.setState({ error });
    }
    console.log(this.state.books);
};

我需要解决什么问题?

4

1 回答 1

2

GoodReads API 不允许您从前端进行 API 调用。(请参阅此GoodReads 论坛问题)。您需要从后端服务(例如 nodejs 服务器)发出 API 请求,或者通过代理。

设置代理可能很痛苦,因此您可以使用YQL(雅虎查询语言)客户端调用 API。

所以这是解决方法。

⚠️ 警告:这不是一个好的做法,而是出于学术目的将其写在这里。请考虑设置您自己的后端服务来调用 API。

直接调用 YQL 可能很麻烦,因此您可以使用另一个名为proxyfy-url 的库,它会为您提供代理的 YQL URL。

var proxify = require('proxify-url');

...

get proxyfiedUrl() {
    // GoodReads API returns result in "XML" format.
    // "XML" is the "input" format fed into YQL
    let proxyUrl = proxify(this.url, { inputFormat: 'xml' });
    return proxyUrl;
}

无耻的插头!如果您想了解更多信息,我在我的博客How to call GoodReads API using YQL
上写过同样的问题

于 2018-07-22T14:56:45.703 回答