>Java >java지도 시간 >SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

PHPz
PHPz앞으로
2023-05-11 12:28:061284검색

Request

SpringBoot가 프런트엔드 매개변수를 허용하는 6가지 방법 첫째, 인터페이스 없이 프런트엔드에서 보낸 요청은 주소 표시줄에서만 보낼 수 있고 다른 요청을 테스트하기 위해서는 Get 요청만 가능하기 때문입니다. 우리는 도구 -> Postman을 사용합니다. Postman은 웹페이지를 디버깅하고 웹페이지에 HTTP 요청을 보내기 위한 강력한 Chrome 플러그인입니다.

프런트 데스크에서 전달된 매개변수는 대략 6가지 유형으로 나누어져 있습니다. 데모를 진행하고 하나씩 살펴보겠습니다. 데모하기 전에 프런트 데스크 매개변수를 얻을 수 있는 방법은 없으며 SpringBoot를 통해 얻습니다. 요청 객체.

@RestController
public class RequestController {
    //原始方式
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        // http://localhost:8080/simpleParam?name=Tom&age=10
        // 请求参数: name=Tom&age=10   (有2个请求参数)
        // 第1个请求参数: name=Tom   参数名:name,参数值:Tom
        // 第2个请求参数: age=10     参数名:age , 参数值:10

        String name = request.getParameter("name");//name就是请求参数名
        String ageStr = request.getParameter("age");//age就是请求参数名

        int age = Integer.parseInt(ageStr);//需要手动进行类型转换
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

Springboot 환경에서는 원본 API가 캡슐화되어 있어 매개변수를 받는 형태가 더 간단합니다. 단순 매개변수인 경우 매개변수 이름은 형식 매개변수 변수명과 동일하며, 동일한 이름의 형식 매개변수를 정의하여 매개변수를 수신할 수 있다.

1. 단순 매개변수

@RestController
public class RequestController {
        // http://localhost:8080/simpleParam?name=Tom&age=10
    // 第1个请求参数: name=Tom   参数名:name,参数值:Tom
    // 第2个请求参数: age=10     参数名:age , 参数值:10
    
    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

백엔드에서 필요하지만 프런트엔드에서 해당 매개변수를 전달하지 않는 경우 이때 null이 반환됩니다.

프런트엔드에서 전달한 매개변수 이름이 메소드의 매개변수 목록과 일치하지 않는 경우 백엔드가 매개변수를 허용하면 @RequestParam(" ")을 사용하여

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    // 请求参数名:name

    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam("name") String username , Integer age ){
        System.out.println(username+"  :  "+age);
        return "OK";
    }
}

를 지정할 수 있습니다. 또한 @RequestParam의 필수 속성은 기본값이 true(기본값도 true)입니다. 이는 요청 매개변수를 전달해야 함을 의미합니다. 전달되지 않으면 오류가 보고됩니다. 매개변수가 선택사항이면 필수가 될 수 있습니다. 속성은 false로 설정됩니다

코드는 다음과 같습니다.

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){
    System.out.println(username+ ":" + age);
    return "OK";
}

이 주석에도 defaultValue라는 매개변수가 있습니다. 매개변수가 프런트 엔드에 전달되지 않으면 기본값은 현재 지정된 값이 됩니다.

    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name", required = false,defaultValue ="匿名用户") String userName, Integer age) {
        
//        打印输出
        System.out.println(userName+"----"+age);
        return "ok";
    }

2. 엔터티 매개변수

간단한 엔터티 개체:

간단한 매개변수를 데이터 전송 방법으로 사용할 때 프런트 엔드에서 전달되는 요청 매개변수 수, 백엔드 컨트롤러 메서드에 작성해야 하는 형식 매개변수 수. 요청 매개변수가 많은 경우, 위의 방법으로 매개변수를 하나씩 받는 것이 더 번거로울 수 있습니다.

이 시점에서는 요청 매개변수를 엔터티 클래스 객체로 캡슐화하는 것을 고려할 수 있습니다. 데이터 캡슐화를 완료하려면 다음 규칙을 준수해야 합니다. 요청 매개변수 이름은 엔터티 클래스의 속성 이름과 동일합니다.

요구사항은 프런트 엔드에서 전달된 매개변수의 이름과 이름이 동일해야 한다는 것입니다. 객체의 매개변수와 동일한 순서입니다.

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    
    //实体参数:简单实体对象  User有两个属性,一个是name 一个是age,这样Spring就会自动完成赋值
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "OK";
    }
}

복잡한 엔터티 개체: 개체 내의 개체

예를 들어 User: Address에 또 다른 필드가 있고 이 클래스에는 두 가지 속성이 있습니다. 이때 프런트엔드에서 매개변수를 전달할 때 변경이 필요하며 User

public class User {
    private String name;
    private Integer age;
    private Address address; //地址对象
    .....
}


public class Address {
    private String province;
    private String city;
    .....
}

메서드 코드

@RestController
public class RequestController {
    //实体参数:复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "OK";
    }
}

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

3. 배열 컬렉션 매개변수

배열 컬렉션 매개변수의 사용 시나리오: HTML 양식에는 다중 선택을 지원하는 양식 항목이 있습니다(확인 상자), 여러 선택 값을 제출할 수 있습니다.

xxxxxxxx?hobby=game&hobby=java

백엔드 프로그램이 위의 여러 값을 수신하는 방법에는 두 가지가 있습니다.

  • array

  • set

배열 매개변수: 요청 매개변수 이름 및 형식 매개변수 그룹 이름이 동일하고 요청 매개변수가 여러 개인 경우 매개변수를 받기 위해 배열 유형 매개변수를 정의합니다.

@RestController
public class RequestController {
    //数组集合参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
}

수집 매개변수:요청 매개변수 이름은 형식 매개변수 컬렉션 개체 이름과 동일하며 요청이 여러 개 있습니다. @RequestParam은 매개변수 관계를 바인딩합니다

기본적으로 요청에서 동일한 매개변수 이름을 가진 여러 값이 배열로 캡슐화됩니다. 컬렉션으로 캡슐화하려면 @RequestParam을 사용하여 매개변수 관계를 바인딩해야 합니다

컨트롤러 메서드:

@RestController
public class RequestController {
    //数组集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }
}

4. 날짜 매개변수

위의 데모는 모두 공통 매개변수이며 일부에 포함될 수 있습니다. 특별한 요구 사항 날짜 유형 데이터의 캡슐화(실제로 우리는 일반적으로 문자열을 저장하고 전송하지 않으므로 여기에서 이해합니다). 예를 들어 다음 요구 사항이 있습니다.

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

날짜에는 다양한 형식(예: 2022-12-12 10:05:45, 2022/12/12 10:05:45)이 있으므로 날짜 유형 매개변수는 다음과 같습니다. 캡슐화할 때 @DateTimeFormat 주석과 해당 패턴 속성을 통해 날짜 형식을 설정해야 합니다.

  • @DateTimeFormat 주석의 패턴 속성에 지정된 날짜 형식은 프런트 엔드 날짜 매개변수가 지정된 형식으로 전달되어야 합니다.

  • 백엔드 컨트롤러 메서드에서는 Date 유형 LocalDateT 또는 LocalDateTime 유형을 사용하여 전달된 매개변수를 캡슐화해야 합니다.

컨트롤러 방식:

@RestController
public class RequestController {
    //日期时间参数
   @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "OK";
    }
}

5. JSON 매개변수

프론트엔드 기술을 배울 때, 프론트엔드와 백엔드와 상호작용할 때 더 복잡한 매개변수라면 JSON에 대해 이야기했습니다. 프런트엔드와 백엔드는 전송을 위해 JSON 형식 데이터를 사용합니다. (JSON은 개발에서 가장 일반적으로 사용되는 프런트엔드 및 백엔드 데이터 상호 작용 방법입니다.) 실제로 백엔드가 프런트엔드에 데이터를 반환하는 경우 일부는 문자열이고 일부는 컬렉션이며 일부는 JSON이라는 점도 확인할 것입니다. , 그러면 프런트엔드에서 이를 구문 분석하는데 매우 번거롭습니다. 나중에 엔터티 클래스를 사용하여 모든 데이터를 저장한 다음 이 개체를 반환하면 프런트 데스크에서는 이를 수신할 때만 처리하면 됩니다. 노트 마지막에 언급해주세요

다음은 Postman Data에서 JSON을 보내는 방법을 소개합니다:

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

服务端Controller方法接收JSON格式数据:

  • 传递json格式的参数,在Controller中会使用实体类进行封装。

  • 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。

@RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)

通过添加@RequestBody注解Spring可以自动的将JSON转换为对象.

实体类:

public class User {
    private String name;
    private Integer age;
    private Address address;
    
    //省略GET , SET 方法
}
@RestController
public class RequestController {
    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }
}

6、路径参数(开发中使用的模式)

传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面通过?key=value的形式传递(GET请求)。

在现在的开发中,经常还会直接在请求的URL中传递参数。例如:

http://localhost:8080/user/1        
http://localhost:880/user/1/0

上述的这种传递请求参数的形式呢,我们称之为:路径参数。

学习路径参数呢,主要掌握在后端的controller方法中,如何接收路径参数。

路径参数:

  • 前端:通过请求URL直接传递参数

  • 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数

Controller方法:

@RestController
public class RequestController {
    //路径参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "OK";
    }
}

传递多个路径参数:

@RestController
public class RequestController {
    //路径参数  前台路径  xxxx/path/12/jack
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id, @PathVariable String name){
        System.out.println(id+ " : " +name);
        return "OK";
    }
}

响应:

前面我们学习过HTTL协议的交互方式:请求响应模式(有请求就有响应)

那么Controller程序呢,除了接收请求外,还可以进行响应。先说一下使用到的注解:

@ResponseBody

  • 类型:方法注解、类注解

  • 位置:书写在Controller方法上或类上

  • 作用:将方法返回值直接响应给浏览器

如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器

在我们前面所编写的controller方法中,都已经设置了响应数据。看一下类的注解@RestController, 这个注解是一个复合注解,里面包括了 @ResponseBody

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

结论:在类上添加@RestController就相当于添加了@ResponseBody注解。

类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器

下面我们来测试下响应数据:

@RestController
public class ResponseController {
    //响应字符串
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World ~");
        return "Hello World ~";
    }
    //响应实体对象
    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address addr = new Address();//创建实体类对象
        addr.setProvince("广东");
        addr.setCity("深圳");
        return addr;
    }
    //响应集合数据
    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<>();//集合对象
        
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return list;
    }
}

在服务响应了一个对象或者集合,那私前端获取到的数据是什么样子的呢?我们使用postman发送请求来测试下。测试效果如下:

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

统一响应结果

可能大家会发现,我们在前面所编写的这些Controller方法中,返回值各种各样,没有任何的规范。

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

如果我们开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护。那在真实的项目开发中是什么样子的呢?

在真实的项目开发中,无论是哪种方法,我们都会定义一个统一的返回结果。方案如下:

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

这样前端只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败

  • 状态码信息:给页面的提示信息

  • 返回的数据:给前端响应的数据(字符串、对象、集合)

定义在一个实体类Result来包含以上信息。代码如下:

public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应码 描述字符串
    private Object data; //返回的数据

    public Result() { }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    //增删改 成功响应(不需要给前端返回数据)
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应(把查询结果做为返回数据响应给前端)
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

改造后的Controller:统一返回Result

@RestController
public class ResponseController { 
    //响应统一格式的结果
    @RequestMapping("/hello")
    public Result hello(){
        System.out.println("Hello World ~");
        //return new Result(1,"success","Hello World ~");
        return Result.success("Hello World ~");
    }

    //响应统一格式的结果
    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        return Result.success(addr);
    }

    //响应统一格式的结果
    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list = new ArrayList<>();

        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return Result.success(list);
    }
}

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?

위 내용은 SpringBoot는 어떻게 프론트엔드 매개변수를 얻고 균일하게 응답하는가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제