关于使用Axios的一些心得

Axios 请求参数传递详解

请求参数位置的区别

GET 请求

  • 参数位置:URL 查询字符串(属于 HTTP 请求头部分)

  • 特点

    • 参数会显示在 URL 中

    • 有长度限制(约 2KB)

    • 会被浏览器缓存、记录在历史记录中

    • 适合非敏感数据和小数据量传输

POST 请求

  • 参数位置:请求体(Request Body)

  • 特点

    • 不会显示在 URL 中

    • 没有严格的大小限制

    • 不会被缓存或记录在历史记录中

    • 适合敏感数据和大数据量传输

Axios 参数传递的正确方式

1. GET 请求参数传递

方式一:使用 params 配置

axios.get('/api/user', {

params: {

id: 123,

name: 'John' }

})

// 实际请求URL: /api/user?id=123&name=John

方式二:直接拼接 URL

axios.get(`/api/user?id=${id}&name=${name}`)

错误示例(避免这样写):

// 错误1:嵌套 data 对象
axios.get('/api/user', {
  params: {
    data: { id: 123, name: 'John' }
  }
})
// 实际请求URL: /api/user?data[id]=123&data[name]=John (不符合常规后端接收方式)

// 错误2:语法错误
axios.get('/api/user', {
  params{ id: 123 }  // 这不是合法的 JavaScript 语法
})

2. POST 请求参数传递

方式一:直接作为第二个参数

javascript

axios.post('/api/user', {
  username: 'john',
  password: '123456'
})

第二个参数会识别成一个json,直接塞到请求体里,如果想放在请求头中,这样写

axios.post('/api/user', null,{

 params:{
  username,
  password,

}
})

方式二:使用 data 配置

axios({
  method: 'post',
  url: '/api/user',
  data: {
    username: 'john',
    password: '123456'
  }
})

方式三:FormData(适合文件上传)

const formData = new FormData()
formData.append('username', 'john')
formData.append('avatar', fileInput.files[0])

axios.post('/api/user', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})

错误示例(避免这样写):

// 错误1:将 POST 参数放在 params 中
axios.post('/api/user', null, {
  params: {
    username: 'john',
    password: '123456'
  }
})


// 这实际上会将参数附加到 URL 上,而不是放在请求体中

// 错误2:嵌套 data 对象
axios.post('/api/user', {
  data: {
    username: 'john',
    password: '123456'
  }
})
// 后端需要额外处理 data 包装层

综合配置示例

axios({
  method: 'post', // 请求方法
  url: '/user/12345', // 请求URL
  data: { // POST/PUT/PATCH 请求体数据
    firstName: 'Fred',
    lastName: 'Flintstone'
  },
  params: { // GET 请求URL参数(如果是POST请求,这个配置通常不需要)
    token: 'abc123' // 少数情况下POST请求也需要URL参数
  },
  headers: { // 自定义请求头
    'X-Requested-With': 'XMLHttpRequest',
    'Authorization': 'Bearer token123'
  },
  timeout: 5000, // 超时设置
  responseType: 'json' // 响应数据类型
})

后端接收方式对应关系

GET 请求参数接收

  • Spring Boot:

    @GetMapping("/user")
    public ResponseEntity<User> getUser(
        @RequestParam Integer id,
        @RequestParam String name) {
      // ...
    }

POST 请求 JSON 数据接收

  • Spring Boot:

    @PostMapping("/user")
    public ResponseEntity<User> createUser(
        @RequestBody UserDto userDto) {
      // ...
    }

POST 表单数据接收

  • Spring Boot:

    @PostMapping("/user")
    public ResponseEntity<User> createUser(
        @RequestParam String username,
        @RequestParam String password) {
      // ...最佳实践建议

  1. 敏感数据(如登录凭证)一定要用 POST 请求

  2. 大数据量传输使用 POST 请求

  3. RESTful API 设计:

    • 获取资源用 GET + URL 参数

    • 创建资源用 POST + 请求体

    • 更新资源用 PUT/PATCH + 请求体

    • 删除资源用 DELETE

  4. 类型安全(TypeScript):

    interface User {
      id: number
      name: string
      email: string
    }

    // 明确指定请求和响应类型
    axios.post<User>('/api/user', {
      name: 'John',
      email: 'john@example.com'
    }).then(response => {
      const user: User = response.data
      // ...
    })

  5. 错误处理

    axios.post('/api/user', data)
      .then(response => {
        // 处理成功响应
      })
      .catch(error => {
        if (error.response) {
          // 服务器返回了错误状态码
          console.log(error.response.status)
          console.log(error.response.data)
        } else if (error.request) {
          // 请求已发出但没有收到响应
          console.log(error.request)
        } else {
          // 其他错误
          console.log('Error', error.message)
        }
      })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值