三、处理post请求和请求头

2020-04-18  本文已影响0人  雪燃归来

通过上两篇文章的回顾,我们已经把整个项目的框架搭建起来了,并且通过重装url实现get数据请求。本篇我们将要实现post数据请求。

一、需求分析

1、post请求使用的是config中data属性的值

axios({
  method: 'post',
  url: '/base/post',
  headers: {
    'content-type': 'application/json;charset=utf-8'
  },
  data: {
    a: 1,
    b: 2
  }
})

2、post请求中,我们要正确地处理请求头的信息,不然后端是不能正常的返回数据

二、代码实现

1、新建/src/helpers/data.ts

\color{red}{注意}:数据在传输的时候要以字符串的形式传递,所以要调用JSON.stringfy()方法

import { isPlainObject } from './util'
export function transformRequest(data: any): any {
  if (isPlainObject(data)) {
    return JSON.stringify(data)
  }
}

2、在/src/index.ts中调用该方法

function processConfig(config: AxiosRequestConfig):void{
  config.url = transformURL(config)
  config.headers = transformHeaders(config)
  config.data = transformDataRequest(config)
}  

function transformDataRequest(config: AxiosRequestConfig): string {
  return transformRequest(config.data)
}

3、处理请求头

新建/src/helpers/header.ts

import { isPlainObject } from './util'
function normalizeHeaderName(headers: any, normalizedName: string): void {
  if (!headers) {
    return
  }
  Object.keys(headers).forEach(name => {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = headers[name]
      delete headers[name]
    }
  })
}

export function processHeaders(headers: any, data: any): any {
  normalizeHeaderName(headers, 'Content-Type')
  if (isPlainObject(data)) {
    if (headers && !headers['Content-Type']) {
      headers['Content-Type'] = 'application/json;charset=utf-8'
    }
  }
  return headers
}

代码逻辑比较直观,此处不做过多的解释。

三、工具函数简单介绍

在这几篇文章中,我们一直使用一些工具方法,为了代码的完整,我把这些工具函数贴出来。
新建/src/helpers/util.ts

const toString = Object.prototype.toString

export function isDate(val: any): val is Date {
  return toString.call(val) === '[object Date]'
}

export function isPlainObject(val: any): val is Object {
  return Object.prototype.toString.call(val) === '[object Object]'
}

要注意的是,我们在上面的函数中使用到了typescript的类型断言。

上一篇下一篇

猜你喜欢

热点阅读