POST请求的两三事

155 阅读2分钟

前言

今天和后端对接的时候,发现自己完全不理解POST请求传递的数据类型,出了很多bug,现在就来总结一下。

axios

项目中的请求都是用axios发送的,经过了一些简单的封装

import axios from 'axios'
import store from '@/store'
// create an axios instance
const service = axios.create({ 
  //baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // request timeout
})
// request interceptor
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    console.log(error) // for debug
    return Promise.reject(error)
  }
)
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.code !== 0) {
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {

      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    return Promise.reject(error)
  }
)
export default service

使用的时候只需要

import request from '@/utils/request'
export function checkUserName(userName){
  return request({
    url: '/user/checkUserName',
    method: 'get',
    params: { userName }
  })
}

对于get请求,按上面的形式就完全可以了。但是对于POST请求,请求参数和数据是放在请求体里的,这时候就需要对其类型进行规范,并和后端进行统一,否则就会报错(各种报错)。

Content-Type

在请求中,Content-Type说白了就是对POST请求内容的数据类型的说明。它有很多种形式,常用的有:multipart/form-dataapplication/jsonapplication/x-www-form-urlencoded。但是不论哪一种,都必须要和后端统一,否则后端会识别不了数据甚至报错。

multipart/form-data

这种形式就是最原始的表单提交类型,但是现在我们一般不直接使用表单提交,而是把数据整合起来单独提交。所以现在需要使用let formdata = new FormData(); formdata.append()来构造一个formdata数据。

axios写法:

export function login(data) {
  return request({
    url: '/user/login',
    method: 'post',
    data,
    headers:{'Content-Type':'multipart/form-data;boundary=****'}
  }) 

其中boundary是用来标志参数开始结尾,以及分割不同参数。如果使用原生表单,设置表单的enctype 等于 multipart/form-data,boundary会自动生成。

application/x-www-form-urlencoded

这种方式就是我们项目使用的方式,看名字就能看出这种方式采用的是url编码。简单来说这种参数类型的POST请求,相当于把get请求的参数,从路径里转移到了请求体了。

axios写法:

import qs from 'qs'
export function login(data) {
  return request({
    url: '/user/login',
    method: 'post',
    data:qs.stringify(data),
    headers:{'Content-Type':'application/x-www-form-urlencoded'}
  }) 

application/json

这种是最常见,同时也是axios的默认发送方式,如果你不设置Content-Type,axios就会用这种方式发送POST请求。

这种发送方式对前端很友好,因为是把json格式直接放在请求体里。

axios写法:

return request({
    url: '/user/register',
    method: 'post',
    data
  })