Node.js调用Goodreads API返回HTML重定向而非XML数据的问题
解决Goodreads API返回重定向HTML而非XML的问题
我刚帮你排查了代码里的几个关键问题,这些应该就是导致你拿到重定向HTML而不是预期XML数据的原因:
问题1:URL参数的HTML实体编码错误
你代码里的请求路径用了&来分隔参数,但这是HTML页面里的转义写法,直接用在HTTP请求的URL中会被服务器错误解析。正确的参数分隔符应该是普通的&符号。
问题2:未替换开发者密钥占位符
如果代码里的{my developer key}还是占位符,没有换成你在Goodreads开发者平台申请的真实密钥,服务器会直接拒绝你的API请求,跳转到公开的书籍详情页面(也就是你看到的重定向HTML)。
问题3:未处理HTTP重定向
Node.js的http.get模块默认不会自动跟随3xx系列的重定向响应,当服务器返回跳转指令时,你需要手动处理才能拿到最终的XML数据。
修改后的可运行代码
var http = require('http'); var xml2js = require('xml2js'); var parser = xml2js.Parser({ explicitArray: false }); var goodreadsService = function () { var getBookById = function (id, cb) { // 务必替换为你的真实Goodreads开发者密钥 var apiKey = 'YOUR_REAL_DEVELOPER_KEY'; var options = { host: 'www.goodreads.com', // 修正参数分隔符,用模板字符串动态拼接书籍ID path: `/book/show/${id}?format=xml&key=${apiKey}` }; var callback = function (response) { // 处理3xx重定向:自动跟随跳转地址 if (response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) { var redirectUrl = new URL(response.headers.location); http.get({ host: redirectUrl.host, path: redirectUrl.pathname + redirectUrl.search }, callback).end(); return; } var str = ''; response.on('data', function (chunk) { str += chunk; }); response.on('end', function () { parser.parseString(str, function (err, result) { if (err) { return cb(err); // 传递解析错误给回调 } cb(null, result.GoodreadsResponse?.book); }); }); }; // 增加请求错误处理,避免无响应情况 http.get(options, callback).on('error', function(err) { cb(err); }).end(); }; return { getBookById: getBookById }; }; module.exports = goodreadsService;
额外注意事项
- 确认你的开发者密钥已经通过Goodreads的审核,并且没有超过调用限额。
- 如果还是有问题,可以在
response.on('end')里先打印str的内容,看看服务器返回的具体错误信息(比如密钥无效、书籍ID不存在等)。
内容的提问来源于stack exchange,提问作者user12625326
相关产品推荐
相关产品推荐

