기술나눔

웹 백엔드 개발-요청 응답

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

목차

머리말

묻다

단순 매개변수

원래 방법

봄 길

요청 후 잘못된 처리

엔터티 매개변수

단순 엔터티 매개변수

복잡한 엔터티 매개변수

편집하다

배열 컬렉션 매개변수

배열 매개변수

편집하다

수집 매개변수

날짜 매개변수

편집하다

JSON 매개변수

편집하다

JSON 데이터 전달

JSON 배열

json 객체(POJO)

json 컬렉션(POJO)

알아채다

경로 매개변수

요청 매핑 경로

@요청매핑

요청 매개변수

응답

@응답본문

통일된 대응 결과


머리말

요청: 요청 데이터 가져오기

응답: 응답 데이터 설정

BS 아키텍처 브라우저/서버, 브라우저/서버 아키텍처 모드, 클라이언트에는 브라우저만 필요하며 애플리케이션 로직과 데이터는 서버에 저장됩니다(유지 관리가 쉽고 평균적인 경험

CS 아키텍처 클라이언트/서버, 클라이언트/서버 아키텍처 모드(개발과 유지관리가 번거롭지만 경험치는 좋습니다

묻다

단순 매개변수

원래 방법

HttpServletRequest를 통해 수동으로 가져오기

  1. import jakarta.servlet.http.HttpServletRequest;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class RequestController {
  6. @RequestMapping("/SimpleParam")
  7. public String SimpleParam(HttpServletRequest request){ //返回的字符串类型是String
  8. String name=request.getParameter("name");
  9. String age=request.getParameter("age"); //通过这个方法得到字符串类型的
  10. int age1=Integer.parseInt(age); //将年龄进行类型转换
  11. System.out.println(name+":"+age1); //设置返回格式
  12. return "OK";
  13. }
  14. }

봄 길

단순 매개변수:매개변수 이름은 정식 매개변수 변수 이름과 동일합니다., 형식 매개변수를 정의하는 것은 매개변수를 수신하는 것을 의미합니다.

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(String name,Integer age){
  5. System.out.println(name+":"+age);
  6. return "OK";
  7. }
  8. }

여기서 Postman의 URL은 모두http://localhost:8080/SimpleParam?name=tom&age=10

위 두 가지 모두 get 요청입니다. post 요청인 경우 postman에 URL만 입력하면 됩니다.http://localhost:8080/심플파라미터

요청 후 잘못된 처리

게시물에 한자가 포함된 경우 배경에 글자가 깨져서 표시되므로 구성에서 필터를 설정하세요.

웹 컨테이너에 필터를 추가하고 문자 집합을 지정합니다. Spring-web 패키지에는 전용 문자 필터가 제공됩니다.

  1. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  2.    protected Class<?>[] getRootConfigClasses() {
  3.        return new Class[0];
  4.   }
  5.    protected Class<?>[] getServletConfigClasses() {
  6.        return new Class[]{SpringMvcConfig.class};
  7.   }
  8.    protected String[] getServletMappings() {
  9.        return new String[]{"/"};
  10.   }
  11.    //乱码处理
  12.    @Override
  13.    protected Filter[] getServletFilters() {
  14.        CharacterEncodingFilter filter = new CharacterEncodingFilter();
  15.        filter.setEncoding("UTF-8");
  16.        return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开
  17.   }
  18. }

이 프로세스는 게시용입니다. get이 중국어로 전달되면 잘못된 문자가 계속 나타납니다.

메소드 매개변수 이름이 요청 매개변수 이름과 일치하지 않으면 @RequestParam을 사용하여 매핑을 완료할 수 있습니다.

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(@RequestParam(name="name") String username, Integer age){ //引号中写的是请求参数名
  5. System.out.println(username+":"+age);
  6. return "OK";
  7. }
  8. }

@PequestParam의 필수 속성은 기본값이 true입니다. 이는 요청 매개변수가 전달되어야 함을 의미합니다. 매개변수가 선택사항인 경우(즉, 전달 가능 여부) 오류가 보고됩니다. 필수 속성을 false로 설정할 수 있습니다. (이러한 방식으로 통과 여부에 관계없이 오류가 보고되지 않습니다.)

엔터티 매개변수

단순 엔터티 매개변수

요청 매개변수 이름은 정식 매개변수 속성 이름과 동일하므로 Pojo를 정의하면 됩니다.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/SimpleParam1")
  4. public String SimplePojo(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  1. public class user {
  2. private String name;
  3. private Integer age;
  4. //加getter和setter方法toString
  5. }

여기 URL은http://localhost:8080/SimpleParam1?name=cat&age=29

복잡한 엔터티 매개변수

요청 매개변수 이름은 형식 매개변수 속성 이름과 동일합니다.를 사용하면 개체 계층 관계에 따라 중첩된 pojo 속성 매개변수를 받을 수 있습니다.

  1. public class user {
  2. private String name;
  3. private Integer age;
  4. private Address address;
  5. //加getter和setter和toString
  6. }
  1. public class Address {
  2. private String province;
  3. private String city;
  4. //加getter和setter还有toString
  5. }
  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/ComplexParam1")
  4. public String ComplexParam(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }

배열 컬렉션 매개변수

배열 매개변수

요청 파라미터 이름은 정식 파라미터 그룹 이름과 동일하며 요청이 여러 개 있습니다., 매개변수를 수신할 배열 유형 형식 매개변수를 정의합니다.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/arrayParam")
  4. public String ArrayParam(String[] hobby) {//在这里建立一个数组,然后后面的名称和传入参数相同
  5. System.out.println(Arrays.toString(hobby));
  6. return "yes";
  7. }
  8. }

수집 매개변수

요청 매개변수 이름은 정식 매개변수 컬렉션 이름과 동일하며 요청 매개변수가 여러 개 있습니다.@요청파라미터바인딩 매개변수 관계

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/listParam")
  4. public String ArrayParam(@RequestParam List<String> hobby) {
  5. System.out.println(hobby);
  6. return "yes";
  7. }
  8. }

날짜 매개변수

@DateTimeFormat 주석을 사용하여 날짜 매개변수 형식 변환을 완료하세요.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/dateParam")
  4. public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {
  5. System.out.println(updateTime);
  6. return "yes";
  7. }
  8. }

  1. //日期参数    
  2. //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd   @RequestMapping("/dataParam")    
  3. @ResponseBody    
  4. public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){        
  5. System.out.println("参数传递 date ==> "+date);        
  6. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);        
  7. System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);        
  8. return "{'module':'data param'}";   }
  9. }
  10. //@DateTimeFormat是形参注解,用在SpringMVC控制器方法形参前面,用于设定日期时间型数据格式//属性:pattern:日期时间格式字符串

테스트 받기:

http://localhost:8080/springmvc_04_request_param/dataParam?날짜=2088/08/08&날짜1=2088-08-18&날짜2=2088/08/28 8:08:08

JSON 매개변수

json 매개변수 키 이름은 형식 매개변수 객체 속성 이름과 동일합니다. Pojo 형식 매개변수를 정의하여 매개변수를 받을 수 있습니다. @RequestBody 식별자를 사용해야 합니다.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/jsonParam")
  4. public String jsonParam(@RequestBody user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  9. //user这和前面的复杂实体参数一样

@requestbody를 통해 json을 사용자 엔터티 클래스로 캡슐화합니다.

JSON 데이터 전달

먼저 좌표 가져오기

  1. <dependency>
  2.  <groupId>com.fasterxml.jackson.core</groupId>
  3.  <artifactId>jackson-databind</artifactId>
  4.  <version>2.9.0</version>
  5. </dependency>

Json 데이터 자동 변환 지원 활성화

  1. @Configuration
  2. @ComponentScan("com.itheima.controller")
  3. //开启json数据类型自动转换
  4. @EnableWebMvc
  5. public class SpringMvcConfig {
  6. }
JSON 배열
   
  1. //集合参数:json格式
  2.    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3.    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
  4. //它用来将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
  5.    @RequestMapping("/listParamForJson")
  6.    @ResponseBody
  7.    public String listParamForJson(@RequestBody List<String> likes){
  8.        System.out.println("list common(json)参数传递 list ==> "+likes);
  9.        return "{'module':'list common for json param'}";
  10.   }
json 객체(POJO)
  1. //POJO参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
  4. @RequestMapping("/pojoParamForJson")
  5. @ResponseBody
  6. public String pojoParamForJson(@RequestBody User user){
  7.    System.out.println("pojo(json)参数传递 user ==> "+user);
  8.    return "{'module':'pojo for json param'}";
  9. }

Get 요청을 할 때:

  1. {
  2.    "name":"xixi",
  3.    "age":21,
  4.    "address":{
  5.        "provice":"taiyuan",
  6.        "city":"taiyuan"
  7.   }
  8. }
json 컬렉션(POJO)
  1. //集合参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
  4. @RequestMapping("/listPojoParamForJson")
  5. @ResponseBody
  6. public String listPojoParamForJson(@RequestBody List<User> list){
  7.    System.out.println("list pojo(json)参数传递 list ==> "+list);
  8.    return "{'module':'list pojo for json param'}";
  9. }

Get 요청을 할 때:

  1. [{"name":"xixi","age":12},
  2. {"name":"haha","age":21}
  3. ]
알아채다

경로 매개변수

요청 URL을 통해 매개변수를 직접 전달하십시오. 경로 매개변수를 식별하려면 {...}를 사용하십시오. 경로 매개변수를 얻으려면 @PathVariable을 사용해야 합니다.

경로 매개변수

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}")
  4. public String pathParam(@PathVariable Integer id) {
  5. System.out.println(id);
  6. return "yes";
  7. }
  8. }

우편 배달부가 테스트한 URL은 다음과 같습니다.http://localhost:8080/경로/1

다중 경로 매개변수

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}/{name}")
  4. public String pathParam(@PathVariable Integer id ,@PathVariable String name) {
  5. System.out.println(id+":"+name);
  6. return "yes";
  7. }
  8. }

우편 배달부가 테스트한 URL은 다음과 같습니다.http://localhost:8080/경로/1/cat

요청 매핑 경로

질문: 개발시 요청하는 경로가 달라야 하는데, 같은 경로가 있으면 어떤 경로를 호출해야 할지 모르겠어서 -----------보통은 통해요.요청 경로의 접두어로 모듈 이름을 설정합니다.

@요청매핑

메소드 주석과 클래스 주석입니다.

SpringMVC 컨트롤러 메서드 정의 위에 배치합니다.

컨트롤러 메소드 요청 경로를 설정하는 데 사용됩니다., 클래스에서 현재 컨트롤러 메서드를 설정하는 경우 액세스 경로 접두사를 요청합니다.

  1. @Controller
  2. //设置模块名作为请求路径的前缀
  3. @RequestMapping("/user")
  4. public class UserController {
  5.    //请求路径映射
  6.    @RequestMapping("/save")
  7.    @ResponseBody
  8.    public String save(){
  9.        System.out.println("user save ...");
  10.        return "{'module':'user save'}";
  11.   }
  12.    //请求路径映射
  13.    @RequestMapping("/delete")
  14.    @ResponseBody
  15.    public String delete(){
  16.        System.out.println("user delete ...");
  17.        return "{'module':'user delete'}";
  18.   }
  19. }

속성: 값(기본값): 요청 액세스 경로.또는 액세스 경로 접두사

요청 매개변수

@RequestParam은 SpringMVC 컨트롤러 메서드 매개변수 정의 앞에 있는 형식 매개변수 주석으로, 요청 매개변수와 프로세서 메서드 매개변수 간의 관계를 바인딩하는 데 사용됩니다.

매개변수: 필수: 필수 매개변수인지 여부 DefaultValue: 매개변수의 기본값

응답

@응답본문

메소드 주석과 클래스 주석인가요?

컨트롤러 메서드/클래스에 위치

기능은메소드 반환 값에 직접 응답합니다. 반환 값 유형이 엔터티 개체/컬렉션인 경우 JSON 형식 응답으로 변환됩니다.

@RestController=@컨트롤러+@응답본문

  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public String hello(){
  5. System.out.println("hello world");
  6. return "hello world~";
  7. }
  8. @RequestMapping("/getAddr")
  9. public Address getAddr(){
  10. Address addr=new Address();
  11. addr.setProvince("山西");
  12. addr.setCity("太原");
  13. return addr;
  14. }
  15. @RequestMapping("/listAddr")
  16. public List<Address> ListAddr(){
  17. List<Address> list=new ArrayList<>();
  18. Address addr=new Address();
  19. addr.setProvince("山西");
  20. addr.setCity("太原");
  21. Address addr2=new Address();
  22. addr2.setProvince("山");
  23. addr2.setCity("太");
  24. list.add(addr);
  25. list.add(addr2);
  26. return list;
  27. }
  28. }

테스트는 postman에 입력됩니다.http://localhost:8080/목록 주소그게 다야, 다른 비슷한 것

외부에 노출된 각 메소드를 기능적 인터페이스(예: 위에 3개의 인터페이스가 있음)라고 하며, 경로는 해당 메소드의 액세스 경로입니다.

문제는 응답 결과가 서로 다르고 결과에 대한 최종 분석이 더 까다로워 응답 결과를 통일할 필요가 있다는 점이다.

통일된 대응 결과

  1. public class Result {
  2. private Integer code;
  3. private String msg;
  4. private Object data;
  5. public Result(){
  6. }
  7. public Result(Integer code,String msg,Object data){
  8. this.code=code;
  9. this.msg=msg;
  10. this.data=data;
  11. }
  12. public Integer getCode() {
  13. return code;
  14. }
  15. public void setCode(Integer code) {
  16. this.code = code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. public void setMsg(String msg) {
  22. this.msg = msg;
  23. }
  24. public Object getData() {
  25. return data;
  26. }
  27. public void setData(Object data) {
  28. this.data = data;
  29. }
  30. public static Result success(Object data){
  31. return new Result(1,"success",data);
  32. }
  33. public static Result success(){
  34. return new Result(1,"success",null);
  35. }
  36. public static Result error(String msg){
  37. return new Result(0,msg,null);
  38. }
  39. @Override
  40. public String toString() {
  41. return "Result{" +
  42. "code=" + code +
  43. ", msg='" + msg + ''' +
  44. ", data=" + data +
  45. '}';
  46. }
  47. }
  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public Result hello(){
  5. System.out.println("hello world");
  6. //return new Result(1,"success","hello world");
  7. return Result.success("hello world~");//需要给前端传送数据
  8. }
  9. @RequestMapping("/getAddr")
  10. public Result getAddr(){
  11. Address addr=new Address();
  12. addr.setProvince("山西");
  13. addr.setCity("太原");
  14. return Result.success(addr);
  15. }
  16. @RequestMapping("/listAddr")
  17. public Result ListAddr(){
  18. List<Address> list=new ArrayList<>();
  19. Address addr=new Address();
  20. addr.setProvince("山西");
  21. addr.setCity("太原");
  22. Address addr2=new Address();
  23. addr2.setProvince("山");
  24. addr2.setCity("太");
  25. list.add(addr);
  26. list.add(addr2);
  27. return Result.success(list);
  28. }
  29. }