作为一名后端java开发工程师,做过很多前后端分离的项目(前后端分离是指将前端和后端代码拆分成两个独立的代码库,这种方式使得前后端代码的开发、测试和部署变得更加灵活和独立。相比于传统的网站开发方式,前后端分离能够提高开发效率、加速响应速度、提高代码可维护性和可扩展性。)如何接收前端好兄弟传过来的参数呢,这是一个问题,我总结了一下几种方式,供大家学习参考,不足请指出
最基本的get请求传参方式,前端在网页设置好参数直接发送给后端,后端接口域名使用HttpServletRequest对象通过.getParameter方法就可以直接获得前端传来的参数
httpServletRequest对象对http请求进行了封装,我们使用这个对象就可以方便快捷的获取http中的信息。HttpServletRequest 对象代表客户端的请求,在里面就包含了所有的客服端信息,我们通过这个对象的方法便可以获取所有的客服端信息,包括请求头和请求体中的所有数据。
其他方法:
- getRequestURL():得到请求的URI
- getRequestURL():得到请求的URL
- getHeader(String s):getHeader表示得到请求头,参数s表示想要获取请求头中的什么数据
- getHeader("Host"):获取请求的主机
- getHeader("Referer"):获取请求来自于哪里,一般用来做防盗链
- getRemotetAddr():得到请求的ip
- getParameter(String s):得到请求参数的值
- getParameterValues(String s):得到请求参数的值,用于参数有多个值,返回一个数组
代码如下:
@Controller
@RequestMapping("user")
public class UserController {
/**
* 第一种方式:
*/
@RequestMapping("/request1")
@ResponseBody
public String request1(HttpServletRequest request, HttpServletResponse response){
String account = request.getParameter("account");
System.out.println(account);
String password = request.getParameter("password");
System.out.println(password);
return "第一种传参已接收";
}
后端接口域的名字与参数名字相同,自动接收参数
代码如下:
/**
* 第二种方式:
*/
@RequestMapping("/request2")
@ResponseBody
public String request2(String account,String password){
System.out.println(account);
System.out.println(password);
return "第二种传参已接收";
}
域名与参数名不一致通过RequestParam将传入的参数赋值给accountA,如果不传参数defaultValue作用是设置默认值
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
代码如下:
/**
* 第三种方式:
*/
@RequestMapping("/request3")
@ResponseBody
//域名与参数名不一致通过RequestParam将传入的参数赋值给accountA,如果不传参数defaultValue作用是设置默认值
public String request3(@RequestParam(value = "account",defaultValue = "666") String accountA, @RequestParam(value = "password",defaultValue = "777")String passwordD){
System.out.println(accountA);
System.out.println(passwordD);
return "第三种传参已接收";
}
打印参数:
当参数类型比较多时,可以采用封装的形式接收参数
/**
* 第四种方式:
*/
@RequestMapping("/request4")
@ResponseBody
//当参数类型比较多时,可以采用封装的形式
public String request4( UserPo user){
System.out.println(user.toString());
return "第四种传参已接收";
}
@Data
public class UserPo {
private String account;
private String password;
@Override
public String toString() {
return "UserPo{" +
"account='" + account + '\'' +
", password='" + password + '\'' +
'}';
}
}
采用Postman使用Post请求,对于post请求传入的JOSN类型的数据,需要用@RequestBody来接收参数
/**
* 第五种方式:
*/
@RequestMapping("/request5")
@ResponseBody
public String request5(@RequestBody UserPo user){
System.out.println(user.toString());
return "第五种传参已接收";
}
post请求种none、form-data、x-www-form-urlencoded、raw、binary几种传参方式的区别是什么呢?
form-data:
就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
x-www-form-urlencoded:
就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=java&age = 23
raw
可以上传任意格式的文本,可以上传text、json、xml、html等
binary
相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。
通过路径的形式传参,例如下面这个网页没有参数的名称而是一长串的数字
代码如下:
/**
* 第六种方式:
*/
@RequestMapping("/request6/{id}")
@ResponseBody
public String request6(@PathVariable String id){
System.out.println(id);
return "第六种传参已接收";
}
个人见解,不足请补充,希望对你有帮助 !