nodejs http请求第三方接口,怎么把bigint传过去?

第三方平台接收参数是bigint,但nodejs这边拿到怎么才不让它自动转换而是原本数据传输呢?

阅读 960
avatarAI BotBETA

在Node.js中,当你需要通过HTTP请求向第三方接口发送bigint类型的数据时,由于HTTP请求本质上是通过文本(如JSON)来传输数据的,你需要先将bigint转换为字符串(或数字,但如果是非常大的数,通常转换为字符串更为合适),因为JavaScript中的bigint在JSON序列化时不会自动处理。

以下是一个示例,展示如何在Node.js中使用axios(一个流行的HTTP客户端库)发送包含bigint的请求:

const axios = require('axios');

// 假设你有一个bigint值
let bigIntValue = BigInt("123456789012345678901234567890");

// 将bigint转换为字符串
let bigIntAsString = bigIntValue.toString();

// 准备发送的数据
let data = {
  bigNumber: bigIntAsString
};

// 发送POST请求到第三方接口
axios.post('https://example.com/api/endpoint', data, {
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  console.error('Error:', error);
});

在这个例子中,bigintbigIntValue被转换为字符串bigIntAsString,然后作为JSON对象的一部分发送。这样,第三方接口就可以接收到一个字符串,然后它自己可以根据需要将该字符串转换回bigint(如果它支持bigint的话)。

注意,如果你确信第三方接口完全支持bigint作为数字处理(虽然这在实践中很少见,因为HTTP和JSON标准不直接支持bigint),你可能需要查找特定的库或方法来直接在HTTP请求中发送原始bigint值,但这通常涉及到底层协议(如二进制协议)的修改,而不是简单的HTTP和JSON。

对于大多数情况,将bigint转换为字符串发送并在接收端进行相应的转换是最简单和最可移植的解决方案。

2 个回答

实在不行就传字符吧。

正如ai回答中提到的

HTTP请求本质上是通过文本(如JSON)来传输数据的

所以,你本质上是传一个字符串过去的,至于这个字符串怎么写,你看第三方平台是怎么约定的,
比如,约定成json: { numberString: "1234567890123456789012345678901234567890" }

以下是使用axios发送请求的示例

你也没说具体的请求方式(如get/post,参数名),所以就只能是提供个方向
const axios = require('axios')
const qs = require('qs')
const bigInt = require('big-integer')
const FormData = require('form-data')

const numberData = bigInt('1234567890123456789012345678901234567890')

const requestData = {
  number: numberData,
  otherData: 'someData',
}

// get请求
axios.get('https://www.demo.com', {
  params: requestData,
  paramsSerializer: params => {
    return [
      qs.stringify(Object.assign({}, params, { number: void 0 }), { format: 'RFC1738' }),
      `number=${params.number.toString()}`
    ].join('&')
  }
})

// post请求(x-www-form-urlencoded形式)
axios.post('https://www.demo.com', {
  data: [
    qs.stringify(Object.assign({}, requestData, { number: void 0 }), { format: 'RFC1738' }),
    `number=${requestData.number.toString()}`
  ].join('&'),
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})


// post请求(form-data形式)
const formData = new FormData()
formData.append('number', requestData.number.toString())
formData.append('otherData', requestData.otherData)
axios.post('https://www.demo.com', {
  data: formData,
  headers: { 
    ...formData.getHeaders(),
  }
})

// post请求(json形式)
axios.post('https://www.demo.com', {
  data: JSON.stringify(requestData, function(key, value) {
    if (key === 'number') {
      return value.toString()
    }
    return value
  }),
  headers: {
    'Content-Type': 'application/json'
  }
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏