首页 > 解决方案 > 将 unirest 'GET' 请求转换为 axios

问题描述

我正在使用 TheRundown API 获取体育数据,他们给我的示例使用 unirest,我正在尝试将该示例转换为 axios 请求。我让它大部分工作,但我遇到的问题是query在 axios 请求中包含参数。

我已经尝试使用paramsaxios 请求,但它没有给我我要求的 JSON 中的额外数据。

这是我试图转换为 axios 的示例代码:

var unirest = require("unirest");

var req = unirest("GET", "https://therundown-therundown-v1.p.rapidapi.com/sports/3/events");

req.query({
    "include": [
        "all_periods",
        "scores"
    ]
});

req.headers({
    "x-rapidapi-host": "therundown-therundown-v1.p.rapidapi.com",
    "x-rapidapi-key": process.env.THERUNDOWN_API_KEY
});


req.end(function (res) {
    if (res.error) throw new Error(res.error);

    console.log(res.body);
});

这是我到目前为止使用 axios 得到的代码:

response = await axios({
  method: "GET",
  url: `https://therundown-therundown-v1.p.rapidapi.com/sports/1/events`,
  headers: {
    "x-rapidapi-host": "therundown-therundown-v1.p.rapidapi.com",
    "x-rapidapi-key": process.env.THERUNDOWN_API_KEY
  },
  params: {
    include: ["all_periods", "scores"]
  }
}).then(
  function(response) {
    sportsData[0].data = response.data;
  }.bind(this)
);

因此,我的 axios 请求中缺少的数据"score": [Object]来自我的 axios 请求。您可以从我在下面发布的 JSON 数据中看到。

这是我从 unirest'GET'请求中得到的 JSON:

{ meta: { delta_last_id: '11e9-bc68-68d68d53-8563-74040f62bb04' },
  events:
   [ { event_id: '402cb5659e1cbf08d6f6648fffcd6f91',
       sport_id: 3,
       event_date: '2019-08-11T20:10:00Z',
       rotation_number_away: 927,
       rotation_number_home: 928,
       score: [Object],
       teams: [Array],
       teams_normalized: [Array],
       line_periods: [Object] },
     { event_id: '4cde94df721e1c18bba6389c0f80b34b',
       sport_id: 3,
       event_date: '2019-08-11T23:05:00Z',
       rotation_number_away: 911,
       rotation_number_home: 912,
       score: [Object],
       teams: [Array],
       teams_normalized: [Array],
       line_periods: [Object] },
     { event_id: 'cbfba54a01f82b54dbc4e417cf2e371b',
       sport_id: 3,
       event_date: '2019-08-11T20:10:00Z',
       rotation_number_away: 913,
       rotation_number_home: 914,
       score: [Object],
       teams: [Array],
       teams_normalized: [Array],
       line_periods: [Object] },
     { event_id: 'd2f689438cc61fdebadd464b40247f4a',
       sport_id: 3,
       event_date: '2019-08-11T19:40:00Z',
       rotation_number_away: 909,
       rotation_number_home: 910,
       score: [Object],
       teams: [Array],
       teams_normalized: [Array],
       line_periods: [Object] } ] }

这是我从 axios'GET'请求中获得的 JSON:

{ meta: { delta_last_id: '11e9-bc68-68d68d53-8563-74040f62bb04' },
  events:
   [ { event_id: '402cb5659e1cbf08d6f6648fffcd6f91',
       sport_id: 3,
       event_date: '2019-08-11T20:10:00Z',
       rotation_number_away: 927,
       rotation_number_home: 928,
       teams: [Array],
       teams_normalized: [Array],
       lines: [Object] },
     { event_id: '4cde94df721e1c18bba6389c0f80b34b',
       sport_id: 3,
       event_date: '2019-08-11T23:05:00Z',
       rotation_number_away: 911,
       rotation_number_home: 912,
       teams: [Array],
       teams_normalized: [Array],
       lines: [Object] },
     { event_id: 'cbfba54a01f82b54dbc4e417cf2e371b',
       sport_id: 3,
       event_date: '2019-08-11T20:10:00Z',
       rotation_number_away: 913,
       rotation_number_home: 914,
       teams: [Array],
       teams_normalized: [Array],
       lines: [Object] },
     { event_id: 'd2f689438cc61fdebadd464b40247f4a',
       sport_id: 3,
       event_date: '2019-08-11T19:40:00Z',
       rotation_number_away: 909,
       rotation_number_home: 910,
       teams: [Array],
       teams_normalized: [Array],
       lines: [Object] } ] }

标签: javascriptreactjsapiaxiosnext.js

解决方案


默认情况下使用 Axios arrayFormat: brackets,并且该 api 期望重复。

当前的 axios 端点:

https://therundown-therundown-v1.p.rapidapi.com/sports/3/events?include[]=all_periods&include[]=scores

正确的端点:

https://therundown-therundown-v1.p.rapidapi.com/sports/3/events?include=all_periods&include=scores

您可以通过提供paramsSerializer使用查询字符串包 arrayFormat 重复来更改此行为。

var qs = require('qs');

response = await axios({
  method: "GET",
  url: `https://therundown-therundown-v1.p.rapidapi.com/sports/1/events`,
  headers: {
    "x-rapidapi-host": "therundown-therundown-v1.p.rapidapi.com",
    "x-rapidapi-key": process.env.THERUNDOWN_API_KEY
  },
  params: {
    include: ["all_periods", "scores"]
  },
  paramsSerializer: function(params) {
       return qs.stringify(params, {arrayFormat: 'repeat'})
  },
}).then(
  function(response) {
    sportsData[0].data = response.data;
  }.bind(this)
);

推荐阅读