🌒 实现处理响应 header 和 data
# 需求分析
前一节,由于返回的  res  响应对象中的  header  是一个字符串,这是因为通过  XMLHttpRequest  对象中的  getAllResponseHeaders  方法获取到的值是如下的一段字符串:
headers: "connection: keep-alive\r\ncontent-length: 13\r\ncontent-type: application/json; charset=utf-8\r\ndate: Sat, 11 Jun 2022 08:02:53 GMT\r\netag: W/\"d-talgBZSHcQOay+ud5zDrtp+2VNk\"\r\nkeep-alive: timeout=5\r\nx-powered-by: Express\r\n"
1
最终希望能攻获取到上面这个字符串解析为一个对象结构。
# parseHeaders  函数实现及应用
 在  src/helpers/headers.ts  中:
export function parseHeaders(headers: string): any {
  let parsed = Object.create(null)
  if (!headers) return parsed
  headers.split('\r\n').forEach(line => {
    let [key, val] = line.split(':')
    key = key.trim().toLowerCase()
    if (!key) return
    if (val) val = val.trim()
    parsed[key] = val
  })
  return parsed
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
使用字符串的方法,处理
headers字符串。
然后使用  src/xhr.ts  使用这个工具函数:
const responseHeaders = parseHeaders(request.getAllResponseHeaders())
1
此时,再运行上一节的 DEMO,可以看到返回的响应对象中的
headers为一个对象了。
# 需求分析
在没有设置  responseType  的情况下,当字符串反应的数据是一个对象字符串吗,可以转换为一个 JSON 对象:
data: "{\"a\":1,\"b\":2}"
1
转换为:
data: {
  a: 1,
  b: 2
}
1
2
3
4
2
3
4
# transformResponse  函数实现以及应用
 在  helpers/data.ts  中:
export function transformResponse(data: any): any {
  if(typeof data === 'string') {
    try {
      data = JSON.parse(data)
    } catch (e) {
      // do nothing
    }
  }
  
  return data
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
在  src/index.ts  中:
function axios(config: AxiosRequestConfig): AxiosPromise {
  processConfig(config)
  return xhr(config).then(res => {
    return transformResponseData(res)
  })
}
// ... 
function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data)
  return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
此处处理了响应的数据的类型。如果为字符串,则使用 JSON 转换为对象。
编辑  (opens new window)
  📢 上次更新: 2022/09/02, 10:18:16
