axios请求requestBody和formData

前言

在vue的后台管理开发中,应需求,需要对信息做一个校验,需要将参数传递两份过去,一份防止在body中,一份防止在formdata中,axios请求会默认将参数放在formdata中进行发送。
对前端而言其实都一样,无非就是参数的格式问题。
对后端而言
(form data)可以用request.getParameter(接收参数名)
(request payload)用request.getParameter是接收不到值,必须用输入流获取,得到字符串在转json
应需求有的接口是需要放在body中有的要放在formdata中,所以前端需要做一个灵活的处理,因为就算只是更改headers中的字段也会让人时时刻刻记得。所以最终我将请求文件封装如下:
/**
 * @description 配置网络请求
 * @author luokaibin chaizhiyang
 */
import axios                from 'axios'
import { Message} from 'element-ui'
import router               from '../router/permission'
import Vue from 'vue'
import VueCookies from 'vue-cookies'
const moment = require('moment');
const Base64 = require('js-base64').Base64;

// loading框设置局部刷新,且所有请求完成后关闭loading框
var loading;
function startLoading() {
  loading = Vue.prototype.$loading({
    lock: true,
    text: "Loading...",
    target: document.querySelector('.loading-area')//设置加载动画区域
  });
}
function endLoading() {
  loading.close();
}

// 声明一个对象用于存储请求个数
var needLoadingRequestCount = 0;
function showFullScreenLoading() {
  if (needLoadingRequestCount === 0) {
    startLoading();
  }
  needLoadingRequestCount++;
};
function tryHideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return;
    needLoadingRequestCount--;
  if (needLoadingRequestCount === 0) {
    endLoading();
  }
};
// 请求拦截
axios.interceptors.request.use(config => {
  let token = "";
  showFullScreenLoading();
  if(VueCookies.isKey('userinfo')) { 
    const USERINFO = VueCookies.get('userinfo');
    if(config.method == 'get') {
      token = Base64.encode(USERINFO.token + '|' + moment().utc().format('YYY-MM-DD HH:mm:ss' + '|' + JSON.stringify(config.params)));
      config.params.hospitalId = USERINFO.hospitalId;
    } else {
      token = Base64.encode(USERINFO.token + '|' + moment().utc().format('YYY-MM-DD HH:mm:ss' + '|' + JSON.stringify(config.data)));
      config.data.hospitalId = USERINFO.hospitalId;
    }
    let TOKENSTART = token.slice(0,10),
        TOKENEND = token.slice(10);
    token = TOKENEND + TOKENSTART;
    config.headers['token'] = token;
  }
  return config;
}, err => {
  tryHideFullScreenLoading();
  Message.error({ message: '请求超时!' });
  return Promise.resolve(err);
})
// 响应拦截
axios.interceptors.response.use(res => {
  tryHideFullScreenLoading();
  switch(res.data.code) {
    case 200:
    return res.data.result;
    case 401:
    router.push('/login');
    VueCookies.remove('userinfo');
    return Promise.reject(res);
    case 201:
    Message.error({ message: res.data.msg });
    return Promise.reject(res);
    default :
    return Promise.reject(res);
  }
}, err => {
  tryHideFullScreenLoading();
  if(!err.response.status) {
    return false;
  }
  switch(err.response.status) {
    case 504:
    Message.error({ message: '服务器被吃了⊙﹏⊙∥' });
    break;
    case 404:
    Message.error({ message: '服务器被吃了⊙﹏⊙∥' });
    break;
    case 403:
    Message.error({ message: '权限不足,请联系管理员!' });
    break;
    default:
    return Promise.reject(err);
  }
})
axios.defaults.timeout = 300000;// 请求超时5fen
// RequestBody export const postJsonRequest = (url, params) => { return axios({ method: 'post', url: url, data: params, headers: { 'Content-Type': 'application/json', }, }); }
// formData export const postRequest
= (url, params) => { return axios({ method: 'post', url: url, data: params, transformRequest: [function (data) { let ret = '' for (let it in data) { ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' } return ret }], headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); } export const getRequest = (url, data = '') => { return axios({ method: 'get', params: data, url: url, }); }
Get请求的话是不需要进行设置的,因为get请求回默认将参数放在params中,post请求的话会有两个,所以我们这里讲post请求封装了两份。其他的东西的话大家不需要查看。
由于笔者近期较忙,所以,随便抽了一下,日后整理将会更新
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: axios是一种用于发送HTTP请求的JavaScript库。它提供了两种发送POST请求的方式:一种是通过请求体发送数据,另一种是通过URL参数发送数据。下面是对这两种方式以及前端axios发送请求与后端Spring Boot应用程序如何接收请求的解释。 1. 请求体方式: 通过axios的post方法发送POST请求时,可以将数据作为请求体的一部分发送给后端。在发送请求时,我们可以将数据以对象的形式传递给axios的post方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user', { username: 'John', password: '123456' }) ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestBody`注解来接收请求体中的数据。通过该注解,Spring Boot会自动将请求体中的JSON数据映射到对应的Java对象上。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestBody User user) { // 处理接收到的用户数据 ... } ``` 2. URL参数方式: 通过axios的post方法发送POST请求时,也可以将数据作为URL参数的一部分发送给后端。在发送请求时,我们可以通过在URL中添加查询参数的方式将数据传递给axios的post方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user?username=John&password=123456') ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestParam`注解来接收URL参数中的数据。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestParam String username, @RequestParam String password) { // 处理接收到的用户名和密码 ... } ``` 这样,我们就可以通过axios的post方法以两种不同的方式发送POST请求,并通过`@RequestBody`或`@RequestParam`在后端的Spring Boot应用程序中接收请求数据。 ### 回答2: axios post请求方式有两种,一种是普通post请求,另一种是使用FormData对象进行post请求。这两种方式可以分别用@RequestParam和@RequestBody接收请求参数。 普通post请求方式可以通过设置请求头`'Content-Type': 'application/json'`来发送json格式的数据,并使用axiosdata参数传递请求参数。后端接口可以使用@RequestBody注解来接收请求参数。@RequestBody注解将请求体中的数据绑定到一个对象上,可以直接使用该对象进行操作。 示例代码如下: 前端代码: ```javascript axios.post('/api/post', { key1: value1, key2: value2 }, { headers: { 'Content-Type': 'application/json' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestBody PostData postData) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } public class PostData { private String key1; private String key2; // 省略getter和setter方法 } ``` 使用FormData对象进行post请求时,可以使用axiosdata参数传递FormData对象。设置请求头`'Content-Type': 'multipart/form-data'`。后端接口可以使用@RequestParam注解来接收请求参数。@RequestParam注解用于获取请求参数的值。 示例代码如下: 前端代码: ```javascript const formData = new FormData(); formData.append('key1', value1); formData.append('key2', value2); axios.post('/api/post', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestParam("key1") String key1, @RequestParam("key2") String key2) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } ``` 以上就是使用axios post发送两种请求方式,并使用@RequestParam和@RequestBody接收请求参数的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值