Информация о книге Goodreads API

Попытка выполнить поиск в API Goodreads для получения информации о книге. В то же время я пытаюсь преобразовать данные из XML в JSON. Я получаю эту ошибку при поиске книги

В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:3000/', следовательно, не имеет доступа.

и предупреждение

Блокировка перекрестного чтения (CORB) заблокировала ответ перекрестного происхождения https://www.goodreads.com/search/index.xml?key=PL6saHk8cIrLeeLG3eylg&q=halo с приложением MIME-типа /xml. См. 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);
};

Что мне нужно исправить?

1 ответ

GoodReads API не позволяет вам вызывать API из front-end. (Обратитесь к этому вопросу форума GoodReads). Вам нужно сделать запрос API от серверной службы (например, сервера nodejs) или пройти через прокси.

Настройка прокси может быть трудной, поэтому вы можете вызывать API с помощью клиента YQL (языка запросов Yahoo).

Итак, вот обходной путь.

⚠️ ВНИМАНИЕ: Это не очень хорошая практика, но она написана здесь для академических целей. Пожалуйста, подумайте о том, чтобы настроить свой собственный серверный сервис для вызова API.

Прямой вызов YQL может быть проблематичным, поэтому вы можете использовать другую библиотеку, proxyfy-url, которая дает вам прокси-URL YQL.

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;
}

Бесстыдная вилка!
Если вы хотите больше информации, я написал о той же проблеме в моем блоге
Как вызвать GoodReads API с помощью YQL

Другие вопросы по тегам