美文网首页
2-2、处理ts-axios的request body

2-2、处理ts-axios的request body

作者: Eileen_1d88 | 来源:发表于2019-12-04 19:14 被阅读0次

XMLHttpRequest的send方法的参数支持Document 和 BodyInit类型,BodyInit包括Blob、BufferSource、FormData、URLSearchParams、ReadableStream、USVString, 当没有数据的时候, 还可以传入null。
但是我们最常用的场景还是传一个普通对象给服务器,例如

axios({
  method: 'post',
  url: '/base/post',
  data: { 
    a: 1,
    b: 2 
  }
})

这个时候data是不能直接传给send函数的,我们需要把它转换成JSON字符串。

tranformRequest函数实现
import { isPlainObject } from "./util";

function transformRequest(data: any): any {
  if (isPlainObject(data)) {
    return JSON.stringify(data)
  }
  return data
}
export {
  transformRequest
}
// 对于FormData、ArrayBuffer, 用isObject还是会判断为true,
// 但是我们这里只需要普通的JSON对象
function isPlainObject(val: any): val is Object {
  return toString.call(val) === '[object Object]'
}
import { AxiosRequestConfig } from "./types";
import xhr from './xhr'
import { buildUrl } from "./helpers/url";
import { transformRequest } from "./helpers/data";

export default function axios(config: AxiosRequestConfig) {
  processConfig(config)
  xhr(config)
}

function processConfig(config: AxiosRequestConfig): void {
  config.url = tranformUrl(config)
  config.data = transformRequestData(config)
}

function tranformUrl(config: AxiosRequestConfig): string {
  const { url, params } = config
  return buildUrl(url, params)
}

function transformRequestData(config: AxiosRequestConfig): any{
  return transformRequest(config.data)
}

至此,data就处理好了,那么接下来编写demo

import axios from '../../src/index'
axios({
  method: 'post',
  url: '/api/base/post',
  data: {
    a: 1,
    b: 2
  }
})

const arr = new Int32Array([21, 31])

axios({
  method: 'post',
  url: '/api/base/buffer',
  data: arr
})
router.post('/base/post', function(req, res) {
  res.json(req.body)
})

router.post('/base/buffer', function(req, res) {
  let msg = []
  req.on('data', (chunk) => {
    if (chunk) {
      msg.push(chunk)
    }
  })
  req.on('end', () => {
    let buf = Buffer.concat(msg)
    res.json(buf)
  })
})

我们发现 /base/buffer 的请求是可以拿到数据,但是 base/post 请求的 response 里却返回的是一个空对象,这是什么原因呢?

实际上是因为我们虽然执行 send 方法的时候把普通对象 data 转换成一个 JSON 字符串,但是我们请求header 的 Content-Type 是 text/plain;charset=UTF-8,导致了服务端接受到请求并不能正确解析请求 body 的数据。

相关文章

网友评论

      本文标题:2-2、处理ts-axios的request body

      本文链接:https://www.haomeiwen.com/subject/ixmlgctx.html