axios transformRequest -如何修改JSON负载

yeotifhr  于 2022-12-18  发布在  iOS
关注(0)|答案(4)|浏览(154)

我在我的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对象。
文件上写着:“数组中的最后一个函数必须返回一个字符串或Buffer、ArrayBuffer、FormData或Stream的示例”--但当然这里我返回的是一个对象,数据。奇怪的是,在axios文档中,它显示他们从transformRequest返回data,但在他们的情况下,这必须是正确的数据类型。
我 * 实际上 * 如何用axios转换有效负载?

wmvff8tz

wmvff8tz1#

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

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

aoyhnmkz

aoyhnmkz2#

难道你不想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);
        },
    ],  
});
ccrfmcuu

ccrfmcuu3#

要修改值而不是覆盖请求中的输出,我将执行以下操作:

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

r7knjye24#

以下是我在TypeScript中的工作原理,灵感来自Phil的concat解决方案:https://stackoverflow.com/a/70949237/2339352
这里的目标是使用humps库来转换为蛇形Python API/从蛇形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 : [])
});

相关问题