【问题标题】:Append a query param to a GET request?将查询参数附加到 GET 请求?
【发布时间】:2019-11-29 11:45:59
【问题描述】:

我正在尝试制作一个简单的 API,该 API 会调用另一个返回一些信息的 API。问题是,为了连接到第二个 API,我需要将查询参数附加到它。

所以到目前为止,我尝试使用 axios.get 来获取 API。如果我不需要在此之上添加查询,那么这将非常简单,但我很难弄清楚如何在我的请求之上附加查询。

我创建了一个对象,从我的末端提取原始查询,然后我使用 JSON.stringify 将我创建的对象转换为 JSON。然后,根据我对 Axios 的理解,您可以附加参数我用逗号分隔 URL。

在第 6 行,我不确定变量是否会保留,但我绝对不能将标签 var 转换为字符串“标签”,所以这就是为什么我把它留下了大括号和反勾号。如果那是错误的,那么请纠正我如何正确地做到这一点。

var 标记是我从末尾提取的查询的名称。该标签是需要转移到 Axios GET 请求的内容。

app.get('/api/posts', async (req, res) => {
    try {
        const url = 'https://myurl.com/blah/blah';
        let tag = req.query.tag;
        objParam = {
            tag: `${tag}`
        };

        jsonParam = JSON.stringify(objParam);

        let response = await axios.get(url, jsonParam);

        res.json(response);
    } catch (err) {
        res.send(err);
    }
});

response 应该等于我向其发出请求的 JSON 文件。

我实际上得到的是一个错误 400,这让我觉得不知何故,Axios 与参数相处的 URL 没有对齐。 (有没有办法检查 Axios 请求的去向?如果我也能看到 axios 触发的实际 url,那么它可以帮助我解决我的问题)

理想情况下,这是我想要实现的流程。它出了点问题,但我不太确定错误在哪里。

-> 我向我的 api 发出请求,例如使用查询“科学”

-> 通过我的 API,Axios 发出 GET 请求: https://myurl.com/blah/blah?tag=science

-> 我从 GET 请求中得到 JSON 响应

-> 我的 API 显示 JSON 文件

【问题讨论】:

  • 你为什么要使用这样的字符串插值:{ tag: `${tag}` },而你可以只做{ tag: tag },甚至只是{ tag }
  • 您可能会更幸运地将 objParam(未字符串化)作为第二个参数传递。或者您可能想尝试使用 qs 中的 stringify 方法,而不是使用 JSON 中的方法。我发现在 axios 中都有帮助
  • @kshetline 我只是不确定对象的值在没有引号的情况下是否有效。

标签: javascript express axios


【解决方案1】:

查看 Axios 的 README 后,看起来第二个参数需要密钥 params。你可以试试:

app.get('/api/posts', async (req, res, next) => {
    try {
        const url = 'https://myurl.com/blah/blah';
        const options = {
            params: { tag: req.query.tag }
        };

        const response = await axios.get(url, options);
        res.json(response.data);
    } catch (err) {
        // Be sure to call next() if you aren't handling the error.
        next(err);
    }
});

如果上述方法不起作用,可以查看query-string

const querystring = require('query-string');

app.get('/api/posts', async (req, res, next) => {
    try {
        const url = 'https://myurl.com/blah/blah?' +
            querystring.stringify({ tag: req.params.tag });

        const response = await axios.get(url);
        res.json(response.data);
    } catch (err) {
        next(err);
    }
});

回复您的评论,是的,您可以合并多个 Axios 回复。例如,如果我期望一个对象字面量是我的response.data,我可以这样做:

const response1 = await axios.get(url1)
const response2 = await axios.get(url2)
const response3 = await axios.get(url3)

const combined = [
    { ...response1.data },
    { ...response2.data },
    { ...response3.data }
]

【讨论】:

  • 我收到一个类型错误:“将循环结构转换为 JSON”。我之前尝试在选项上使用 JSON.stringify() 但我仍然遇到同样的错误。
  • 您可以通过执行res.json(response.data) 来解决此错误。如果您需要回复的其他部分,您可以查看here
  • 嘿,response.data 有效!对此感激不尽。你认为你可以解释它是如何/为什么起作用的吗? “将循环结构转换为 JSON”是什么意思?
  • 您可以通过data键从成功的Axios响应中接收数据。这适用于所有返回数据的方法。不幸的是,我对循环结构错误了解不多,但我相信 Express 最有可能在 res.json 的底层使用 JSON.stringify。正如site 所引用的,JSON.stringify 无法序列化包含循环引用的 JavaScript 结构。
  • 我更新了我的帖子来回答你的问题。在这里回答,是的,你可以使用 Axios 的response.data 作为一个 JS 普通对象,如果需要的话可以将它们组合起来。如果需要多次调用axios,也可以考虑使用axios.all()axios.spread()
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 2017-09-05
  • 2012-04-12
  • 2016-08-15
  • 1970-01-01
  • 2020-07-15
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多