前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Axios携带数据发送请求及后端接收方式

Axios携带数据发送请求及后端接收方式

作者头像
十玖八柒
发布2022-08-01 09:26:40
9.3K1
发布2022-08-01 09:26:40
举报
文章被收录于专栏:ahzoo.cn的博客分享

数据类型

方法

内容类型(Content-Type)

编码方式

GET

\

Query String Parameters

POST

application/json

Request Payload

POST

application/x-www-form-urlencoded

Form Data

POST

multipart/form-data

Form Data

  • Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。
    • application/json:参数的类型是JSON,后端一般用实体类对象或者具体的参数接收,还可以使用集合接收。
    • application/x-www-form-urlencoded:参数的类型是被编码过的表单数据,后端一般用实体类对象或者具体的参数接收,还可以从Paramer中获取。
    • multipart/form-data:参数的类型是表单数据,后端一般用实体类对象或者具体的参数接收,还可以从Paramer中获取。
  • 编码方式
    • Query String Parameters:参数的传递方式为拼接在网址上,格式为加使用&连接的参数,空格则用+表示。
    • Request Payload:参数的传递方式是在放在Payload Body即请求体中,格式为:key:value
    • Form Data:参数的传递方式是放在表单中,格式为name:value

 GET方法请求的参数默认是直接拼接在url后面的,Content-Type是无法进行修改的。

POST方法Content-Type的修改方式:

  • 指定全局默认请求头: axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  • 直接在请求中指定: {headers:{'Content-Type':'application/x-www-form-urlencoded'}}

前端发送

axios官方文档

GET

GET请求的Content-Type默认为:application/json

代码语言:javascript
复制
axios.get('/user?id=999&name=ahzoo')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });


// 上面的请求也可以这样做
axios.get('/user', {
    params: {
        id: 999,
        name: 'ahzoo',
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });
图片
图片
图片
图片

POST

application/json
代码语言:javascript
复制
      axios
        .post('/api/ahzoo', {
          id: 999,
          name: 'ahzoo',
        })
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });
图片
图片

可以看到数据在payload(负载)中,且数据格式为JSON:

图片
图片
multipart/form-data
代码语言:javascript
复制
      let formData = new FormData();
      formData.append('id', 999);
      formData.append('name', 'ahzoo);
      axios
        .post('/api/ahzoo', formData)
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });
图片
图片
图片
图片
application/x-www-form-urlencoded

方式一:

代码语言:javascript
复制
      let param = new URLSearchParams();
      param.append('id', 999);
      param.append('name', 'ahzoo');
      axios
        .post('/api/ahzoo', param)
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });
图片
图片
图片
图片

方式二: 使用QS,官方地址(axios自带qs库,无需再次安装)

qs是查询字符串解析和将对象序列化的库,qs的两个主要使用方法:

  • qs.stringify():将对象序列化成url的形式,以&进行拼接
  • qs.parse():将url解析成对象形式
代码语言:javascript
复制
      axios
        .post(
          '/api/ahzoo',
          qs.stringify({
            id: 999,
            name: 'ahzoo'
          })
        )
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);

        });
图片
图片
图片
图片
对象嵌套

使用默认的方式传递数据时,如果参数为对象,是需要将对象序列化操作的:

代码语言:javascript
复制
let user = {
        username: '十玖八柒',
        url: 'ahzoo.cn',

      };
      let param = new URLSearchParams();
      param.append('id', 999);
      param.append('name', 'ahzoo');
      param.append('user', JSON.stringify(user));
      axios
        .post('/api/ahzoo', param)
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });

后端接收到的也是序列化后的对象,也就是json数据:

图片
图片

而使用QS序列化的话,是不用再将参数中的对象序列化的:

代码语言:javascript
复制
      axios
        .post(
          '/api/ahzoo',
          qs.stringify({
            id: 999,
            name: 'ahzoo',
            user: user
          })
        )
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });

后端可以直接从Paramer中通过获得参数名为对象[属性]的方式获取数据

图片
图片

并发请求

执行多个并发请求:

代码语言:javascript
复制
function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // 两个请求现在都执行完成
  }));

默认配置

代码语言:javascript
复制
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

拦截器

在请求或响应被 thencatch 处理前拦截它们。

代码语言:javascript
复制
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

移除拦截器:

代码语言:javascript
复制
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

说明

关于一些自定义操作,请移步官方文档

后端接收

Query String Parameters和Form Data

Query String ParametersForm Data在后端的接收方式一样

方式一: 在Request中拿到对应的Parameter数据

代码语言:javascript
复制
import javax.servlet.http.HttpServletRequest;

......

@RequestMapping("api/ahzoo")  
public void toGetInfo(HttpServletRequest request){  
    String id = request.getParameter("id");  
    String name = request.getParameter("name");  
    System.out.println(id); // 999
    System.out.println(name); // ahzoo
}
图片
图片

方式二: 直接使用对应的参数名或者实体类拿到Request中的数据:

代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(String name, String id){  

    System.out.println(id); // 999  
    System.out.println(name); // ahzoo
}
图片
图片
代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(Info info){  

    System.out.println(info); // Info(id=999, name=ahzoo)
}
图片
图片

Request Payload

因为参数是直接放在请求体(Payload Body)中,所以需要从请求体中拿到数据: 使用@RequestBody注解从请求体中拿到数据,同样也是可以使用对应的实体类或参数接收

代码语言:javascript
复制
import org.springframework.web.bind.annotation.RequestBody;

......
@RequestMapping("api/ahzoo")
public void toGetInfo(@RequestBody Info info){  
    System.out.println(info); // Info(id=999, name=ahzoo)
}
图片
图片
代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(@RequestBody String id, @RequestBody String name){   
    System.out.println(name); // ahzoo  
    System.out.println(id); // 999
}
图片
图片

由于参数是JSON格式的,所以还可以使用集合接收:

代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(@RequestBody HashMap<String,String> info){  

    String id = info.get("id");  
    String name = info.get("name");  

    System.out.println(id); // 999  
    System.out.println(name); // ahzoo
}
图片
图片

对象嵌套

接收序列化的对象: 和接收普通的参数一样,用字符串类型数据接收,或者直接从Paramer中获取

代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(String id, String name, HttpServletRequest request) {  

    String user= request.getParameter("user");  // {"username":"十玖八柒","url":"ahzoo.cn"}
    System.out.println(name);  // ahzoo 
    System.out.println(id); // 999
}
图片
图片

接收QS传递的对象:

代码语言:javascript
复制
@RequestMapping("api/ahzoo")  
public void toGetInfo(String id, String name, HttpServletRequest request) {  

    String username = request.getParameter("user[username]");  // 十玖八柒
    String url = request.getParameter("user[url]");  //ahzoo.cn
    System.out.println(name); // ahzoo
    System.out.println(id); // 999
}
图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据类型
  • 前端发送
    • GET
      • POST
        • application/json
        • multipart/form-data
        • application/x-www-form-urlencoded
        • 对象嵌套
      • 并发请求
        • 默认配置
          • 拦截器
            • 说明
            • 后端接收
              • Query String Parameters和Form Data
                • Request Payload
                  • 对象嵌套
                  相关产品与服务
                  文件存储
                  文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档