繁体   English   中英

axios transformRequest - 如何改变 JSON 有效负载

[英]axios transformRequest - how to alter JSON payload

我在我的 Express API 中使用axios并且我想在将其发送到另一个 API 之前转换有效载荷。axios 就是这个叫做transformRequest的东西。 这是我遇到问题的地方。

我的代码看起来像:

const instance = axios.create({
  baseURL: 'api-url.com',
  transformRequest: [
    (data, headers) => {
      const encryptedString = encryptPayload(JSON.stringify(data));

      data = {
        SecretStuff: encryptedString,
      };

      return data;
    },
  ],  
});

// firing off my request using the instance above:
const postData = {
    id: 1,
    name: 'James',
};
instance.post('/getStuff', postData)

最后,我想发布api-url.com JSON: {"SecretStuff": "some-base64-string"} - 而不是上面显示的postData object。

从文档中,它说:“数组中的最后一个 function 必须返回一个字符串或 Buffer、ArrayBuffer、FormData 或 Stream 的一个实例”——但当然我在这里返回一个 object 数据。 奇怪的是,在 axios 文档中,它显示他们从transformRequest返回data ,但在他们的情况下,这必须是正确的数据类型。

我如何使用 axios实际转换有效负载?

axios.create({
    transformRequest: [(data, headers) => {
        // modify data here
        return data;
    }, ...axios.defaults.transformRequest]
});

必须在此处将原始axios.defaults.transformRequest附加到transformRequest选项。

您不想JSON.stringify()转换后的帖子数据吗? 像下面这样:

const instance = axios.create({
    baseURL: 'api-url.com',
    transformRequest: [
        (data, headers) => {
            const encryptedString = encryptPayload(JSON.stringify(data));

            data = {
                SecretStuff: encryptedString,
            };

            return JSON.stringify(data);
        },
    ],  
});

要修改值而不是覆盖请求中的输出,我会这样做:

const instance = axios.create({
baseURL: 'api-url.com',
transformRequest: [
    (data, headers) => {
        data.append('myKey','myValue');            
        return data;
    },
]
});

这是 TypeScript 中对我有用的,灵感来自 Phil 的concat解决方案: https://stackoverflow.com/a/70949237/2339352

这里的目标是使用humps库来转换到/从蛇案例 Python API:

this.axios = axios.create({
    transformResponse: (data: any) => {
        return humps.camelizeKeys(JSON.parse(data))
    },
    transformRequest: [(data: any) => {
        return humps.decamelizeKeys(data);
    }].concat(axios.defaults.transformRequest ? axios.defaults.transformRequest : [])
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM