为了账号安全,请及时绑定邮箱和手机立即绑定

执行 http 请求时出错:未定义:1 <head><title>Document Moved

执行 http 请求时出错:未定义:1 <head><title>Document Moved

HUWWW 2022-07-15 09:41:34
在节点中执行 http 请求时出错。当我使用如下代码时,我得到了错误。我尝试了以下代码:const http = require('http')class postalData { async getPostData(pinCode){  let result = new Promise((resolve, reject) => {    http.get('http://postalpincode.in/api/pincode/' + pinCode,(res)=>{      let data = '';      // A chunk of data has been recieved.      res.on('data', (chunk) => {        data += chunk;      });      // The whole response has been received. Print out the result.      res.on('end', () => {        resolve(JSON.parse(data).explanation);      });    }).on("error", (err) => {      reject(err.message);    });    })  const newLocal = await result  return newLocal }}const getData = new postalData()console.log('Post data : ', getData.getPostData(400705))在节点中执行 http 请求时出现以下错误。当我使用如下代码时,我得到了错误。如下所示:undefined:1<head><title>Document Moved</title></head>^SyntaxError: Unexpected token < in JSON at position 0    at JSON.parse (<anonymous>)    at IncomingMessage.<anonymous> (/home/rahul/indian-post/a.js:23:22)    at IncomingMessage.emit (events.js:327:22)    at endReadableNT (_stream_readable.js:1201:12)    at processTicksAndRejections (internal/process/task_queues.js:84:21)我的预期输出:{   "Message":"Number of Post office(s) found: 1",   "Status":"Success",   "PostOffice":[      {         "Name":"Sanpada",         "Description":"",         "BranchType":"Sub Post Office",         "DeliveryStatus":"Delivery",         "Taluk":"NA",         "Circle":"NA",         "District":"Thane",         "Division":"New Mumbai",         "Region":"Mumbai",         "State":"Maharashtra",         "Country":"India"      }   ]}
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

该请求http://postalpincode.in/api/pincode/400705会产生一个带有标头的301 Moved Permanently响应,该标头Location: http://www.postalpincode.in/api/pincode/400705告诉您资源在 可用http://www.postalpincode.in/api/pincode/400705

如果您http://postalpincode.in/api/pincode/400705在浏览器中打开,它将自动处理该301响应并打开该给定位置。

node的http模块不会这样做,它会为您提供实际的响应(这是http模块的预期行为)

如果您想使用该模块,那么您需要编写自己的逻辑来遵循重定向或使用像requestwich 这样的库提供了遵循这些重定向的选项。

您需要检查response.statusCode是否是301302,如果是,则需要使用 获取Location标头response.getHeader(name),然后重新发出请求,对于新的响应,您需要执行相同的操作,以防发生另一个重定向。


查看完整回答
反对 回复 2022-07-15
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您正在尝试使用普通的 http 调用,但服务器正在响应redirect(Document Moved)。节点http不会跟随重定向,因此它会响应重定向的 HTML。

您可以使用requestpackage来跟踪重定向,或者使用更简单的包,例如follow-redirectshttp它们为跟随重定向的节点提供了一个替代品。

编辑:如果您不想使用外部库,只需检查响应标头和 statusCode,如下所示request

if (response.statusCode >= 300 && response.statusCode < 400 && response.headers['location']) { /* retry the http request at the location */ }



查看完整回答
反对 回复 2022-07-15
  • 2 回答
  • 0 关注
  • 301 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号