美文网首页
服务器端请求快递100接口返回301

服务器端请求快递100接口返回301

作者: 前端老邹_伯通 | 来源:发表于2021-04-24 19:49 被阅读0次

正常查询快递100步骤:
1.根据单号 查询所属快递公司 -- 问题出在此步骤
2.再根据 单号+快递公司编号 查询 快递实时情况

问题描述:

1.第一步:根据单号 查询所属快递公司 接口如下:

  • 提供测试单号:1106975712662
const url1 = 'https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=单号'
  • 预期返回结果:


    正常返回结果
  • 问题返回结果:


    问题返回结果
  • 但是用浏览器可以正常得到结果:


    用浏览器可以正常得到结果

问题分析:快递100接口内部判断了 请求头的 user-agent,如果不是浏览器发的 请求,就不查询,并返回301(估计是为了促进收费接口的销量)

解决方案:伪装成浏览器请求

  • 为请求头 添加 user-agent
  • 代码演示:
// 导入 request 模块
const request = require('request')

// 自动匹配运单号所属的物流公司
function findKuaiDiCom(orderno) {
  // 1.准备 查询快递公司的 url地址,将 快递单号 拼接到 url中
  const url = `https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=${orderno}`
  return new Promise(function (resolve, reject) {
    // 准备请求报文参数对象
    const options = {
      url: url,
      // 需要伪装 成浏览器 发送请求,否则 快递接口 会报错 301
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
      }
    };
    // 在 服务器端 ,通过http协议 发送请求,给 目标 地址
    request(options, (err, response, body) => {
      if (err) return reject({ status: 500, msg: err.message })
      body = JSON.parse(body)
      if (body.auto.length <= 0) return reject({ status: 501, msg: '无对应的物流公司' })
      resolve({ status: 200, msg: body.auto[0], comCode: body.auto[0].comCode })
    })
  })
}

第二步,根据单号和快递公司查询 物流信息

  • 接口如下:
const url2 ="https://www.kuaidi100.com/query?type=ems&postid=1106975712662&temp=0.2595247267684455"
  • 返回结果:


    image.png
  • 代码演示2

// 根据 单号 查询 快递进度 接口
async function getLogisticsInfo(req, res) {
  // result = { status: 200, msg: body.auto[0], comCode: body.auto[0].comCode }
  // 1.获取快递单号
  const kuaiDiNo = req.params.orderno
  // 2.根据 快递单号 查询 快递公司信息
  const result = await findKuaiDiCom(kuaiDiNo)

  if (result.status !== 200) {
    return {
      meta: {
        status: 500,
        message: '获取物流信息失败!'
      }
    }
  }

  const dataUrl = `https://www.kuaidi100.com/query?type=${result.comCode}&postid=${req.params.orderno}&temp=` + Math.random()
  console.log('物流二次请求:', dataUrl)
  request(dataUrl, (err, response, body) => {
    if (err) {
      return res.send({
        meta: {
          status: 501,
          message: '获取物流信息失败!'
        }
      })
    }
    // 获取物流信息成功
    return res.send({
      meta: {
        status: 200,
        message: '获取物流信息成功!'
      },
      data: (JSON.parse(body)).data
    })
  })
}

相关文章

  • 服务器端请求快递100接口返回301

    正常查询快递100步骤:1.根据单号 查询所属快递公司 -- 问题出在此步骤2.再根据 单号+快递公司编号 查询...

  • 爬虫遇到301或302重定向可以用urllib请求

    爬虫遇到301或302重定向可以用urllib请求,用requests请求返回的301重定向,换用urllib请求...

  • 后端返回状态码的几种方式

    前端调用后端接口时,需要关注接口返回的状态码,由状态码来判断请求是否成功。比如,500是服务器端的错误,404可能...

  • 异步promise

    请求两个接口A,B,接口B的数据以来A接口的返回值,所以B需要等A接口返回后再发送请求

  • maven_4_接口和json

    接口 物流接口 快递接口: http://www.kuaidi100.com/query?type=快递公司代号&...

  • http请求-自定义

    1.网络请求框架 实现 1.线程管理类 单例实现 2.请求的接口 3.请求的返回接口 4.请求的数据返回接口 5....

  • RestFul 通用接口设计

    一、API接口统一返回类 定义接口通用的结果返回类JsonResult,其中包括请求状态码(code)、请求信息(...

  • TSS对接api

    认证 接口列表 认证接口详情 login 请求方法 POST 请求参数 返回结果 register 请求方法 PO...

  • 22. 如何编写接口文档

    登录 接口描述 用户登录接口 接口地址 请求参数 返回值 创建博客 接口描述 创建博客接口 接口地址 请求参数 返...

  • markdown写后台api文档

    接口文档示例 用户模块 接口详情 登录接口 接口地址:/user返回格式:Json请求方式:Post请求示例:/u...

网友评论

      本文标题:服务器端请求快递100接口返回301

      本文链接:https://www.haomeiwen.com/subject/psplrltx.html