javascript - 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’);
});
});
如何解决它并检索结果。
我在这里浏览了许多链接,但似乎没有任何帮助。谁能帮我弄清楚这个问题。
问候
解决方案
对于像我这样对找到这个问题的答案完全失去希望并且满怀信心地来到这里的人,但是在 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
}
}
希望我能帮上忙,虽然晚了一年:)
推荐阅读
- r - 手动安装 R 包时权限被拒绝
- haskell - groupBy 的奇怪行为
- kotlin - 从 html 或 json 文件解析网页?哪一个更好?
- python - 我无法抓取视频描述中的所有内容
- java - 在 CSV 文件上用 Java 编写 MS 访问表
- pipenv - 我可以在路径中添加 pipenv 吗?怎么做?
- python - 安装核心拱门
- javascript - 如何在不粘到另一个单元格的情况下填充表格单元格
- vue.js - 如何插入 nuxt-link 的 `to` 道具?
- visual-studio-code - 安装 julia 和 vscode 时。收到错误“无法启动 julia 语言服务器。”