首页 > 解决方案 > goodreads API 提供了 Cross-Origin Request Blocked: javascript 中的错误

问题描述

我正在尝试在 javascript 中列出来自 goodreads 的书籍,但它给出了 Cross-Origin Request Blocked 错误。

const uri = ‘https://www.goodreads.com/search/index.xml?key={mykey}=Ender%27s+Game';

let f = new Headers();

let req = new Request(uri, {

method : ‘GET’,

headers :f,

mode :’cors’

});

fetch(req).then((response) => {

}).then( (jsonData) => {

}) .catch( (err) => {

console.log(‘err’);

});

});

如何解决它并检索结果。

我在这里浏览了许多链接,但似乎没有任何帮助。谁能帮我弄清楚这个问题。

问候

标签: javascriptajax

解决方案


对于像我这样对找到这个问题的答案完全失去希望并且满怀信心地来到这里的人,但是在 SO 中没有答案,这里是要遵循的方法。

背景。自 2015 年以来一直有人提出解决此问题(根据 Goodreads 论坛)。至少 6 年,考虑到解决问题的容易程度,放弃你的希望,因为这不会发生,可悲的是。

旁注。不要费心向 Goodreads 寻求JSON回应。Goodreads 不会给你任何东西,但会给你一个 HTML iframe。顺便说一下,这不是 JSON 响应,正如您猜到的那样。而是使用 XML 响应( format=xml)。不用担心,Node 中有一个库可以帮助您:xml2js

解决方案。与许多 CORS 问题一样,这可以通过反向代理解决(假设您无法更改服务器)。

有很多选择。我找到了 cors-anywhere,有一个公共服务器指向 ( https://cors-anywhere.herokuapp.com/),但它也可以安装在你的机器上。对于 Goodreads,请求 URL 应采用以下格式:https://cors-anywhere.herokuapp.com/https://www.goodreads.com/book/isbn/{isbn}?format=xml&user_id={userid}&key={apikey}.

我最终使用axios 库来建立连接(正如这篇Goodreads 开发人员帖子中所推荐的那样)

我的 Angular 解决方案(但我想它可以很容易地转换为任何 JS 系统,包括纯 Web)。

. . .
import axios from 'axios';
import { AxiosInstance } from "axios";
import * as xml2js from 'xml2js'; // To parse XML to JSON-like
. . .


export class YourService {

  private axiosClient: AxiosInstance;

  constructor(private httpClient: HttpClient) {

    this.axiosClient = axios.create({
            timeout: 3000,
            headers: {
                "X-Initialized-At": Date.now().toString()
            }
        });

  }


  async getBook(isbn: string):Promise<YourBookObject> {
    . . .
    var config = {headers: {"X-Requested-With" : "XMLHttpRequest"}};
    var url = "https://cors-anywhere.herokuapp.com/https://www.goodreads.com/book/isbn/"+isbn+"?format=xml&user_id="+userid+"&key="+apikey
    await this.axiosClient.get(url, config )
    .then(function (response) {
          if(response.status == 200){
            xml2js.parseString( response.data, function (err, result) {
              console.log("XML-JSON Parse")
              console.log(result); // Prints JSON object!
              . . .
            });
          }
        })
    .catch(function (error) {
          console.log(error);
    })
    . . . // additional checks to response and return
  }

}

希望我能帮上忙,虽然晚了一年:)


推荐阅读