螺竹编程
发布于 2024-05-04 / 13 阅读
0

SpringBoot基础/Web:SpringBoot与HTTP请求

介绍

在Spring Boot项目中,你可以使用Spring框架提供的各种工具和注解来处理HTTP请求。Spring Boot提供了简单且强大的方式来处理HTTP请求,并且可以轻松地与其他Spring组件集成。

下面是一些在Spring Boot项目中处理HTTP请求的常见方法和概念:

  1. 注解:Spring Boot使用注解来标记和处理HTTP请求。常用的注解包括:

    • @RequestMapping:将HTTP请求映射到相应的处理方法。

    • @GetMapping@PostMapping@PutMapping@DeleteMapping等:用于定义具体的HTTP请求方法(GET、POST、PUT、DELETE)的映射。

    • @PathVariable:用于将URL中的路径参数绑定到方法参数。

    • @RequestParam:用于将HTTP请求中的查询参数绑定到方法参数。

    • @RequestBody:用于将HTTP请求中的请求体内容绑定到方法参数。

  2. 控制器(Controller):在Spring Boot中,你可以创建控制器类来处理HTTP请求。控制器类使用上述注解来定义和处理具体的请求。你可以在控制器类中定义多个处理方法,每个方法处理不同的URL请求。

    例如,下面是一个使用@GetMapping注解的控制器方法的示例:

    @RestController
    public class UserController {
        @GetMapping("/users/{id}")
        public User getUser(@PathVariable("id") Long id) {
            // 处理获取用户信息的逻辑
        }
    }
    
    // 在上面的示例中,`@GetMapping`注解将HTTP GET请求映射到`getUser`方法,并且将URL中的`id`路径参数绑定到`id`方法参数上。
  3. 请求和响应对象:Spring Boot会自动将HTTP请求映射为Java对象,并将处理方法的返回值转换为HTTP响应。你可以使用@RequestBody注解将HTTP请求的内容绑定到Java对象上,并使用方法的返回值来生成HTTP响应。

    例如,下面是一个处理POST请求的示例:

    @RestController
    public class UserController {
        @PostMapping("/users")
        public User createUser(@RequestBody User user) {
            // 处理创建用户的逻辑
        }
    }
    
    // 在上述示例中,`@PostMapping`注解将HTTP POST请求映射到`createUser`方法,并使用`@RequestBody`将请求体的内容绑定到`user`参数上。方法的返回值将作为HTTP响应的内容。
  4. 响应状态和头:你可以使用方法的返回值来设置HTTP响应的状态码和头信息。例如,可以使用ResponseEntity对象来自定义HTTP响应。

    @RestController
    public class UserController {
        @GetMapping("/users/{id}")
        public ResponseEntity<User> getUser(@PathVariable("id") Long id) {
            User user = userService.getUserById(id);
            if (user != null) {
                return ResponseEntity.ok(user);
            } else {
                return ResponseEntity.notFound().build();
            }
        }
    }
    // 在上述示例中,如果找到了用户,则返回状态码200和用户对象作为响应;如果未找到用户,则返回状态码404。

示例

项目地址:CodeCoderCoding/Spring-Boot-Demo: Spring-Boot的Demo。Spring-Boot基础、Spring-Boot与数据库、Spring-Boot与安全、Spring-Boot与消息队列 (github.com)

项目结构

HttpApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class A03SpringBootHttpApplication {

    public static void main(String[] args) {
        SpringApplication.run(A03SpringBootHttpApplication.class, args);
    }

}

HttpRequest.java

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
public class HttpRequest {
    private Map<String,Object> params = new HashMap<>();

    /**
     * 功能描述:测试restful协议,从路径中获取字段
     * localhost:8081/request-mapping/value1/value2
     */
    @RequestMapping(path = "/request-mapping/{param1}/{param2}", method = RequestMethod.GET)
    public Object findUser(@PathVariable("param1") String param1,
                           @PathVariable("param2") String param2 ){
        params.clear();
        params.put("param1", param1);
        params.put("param2", param2);
        return params;
    }

    /**
     * 功能描述:测试GetMapping
     * 路径含有参数: localhost:8081/get-mapping/param-in-path?param1=1&param2=2
     */
    @GetMapping(value="/get-mapping/param-in-path")
    public Object pageUser(int param1, int param2){
        params.clear();
        params.put("param1", param1);
        params.put("param2", param2);
        return params;
    }

    /**
     * 功能描述:默认值,是否必须的参数
     * 路径含有参数: localhost:8081/get-mapping/default-value
     */
    @GetMapping(value="/get-mapping/default-value")
    public Object pageUserV2(@RequestParam(defaultValue="0",name="alias1") int param1, int param2 ){
        params.clear();
        params.put("param1", param1);
        params.put("param2", param2);
        return params;
    }

    /**
     * 功能描述:bean对象传参
     * 注意:1、注意需要指定http头为 content-type为application/json
     * 		2、使用body传输数据
     * 	请求的url: localhost:8081/request-mapping/bean-transfer
     * 	body内容:
     * {
     *     "id": "1",
     *     "name": "supremepole",
     *     "url": "https://cs.supremepole.com"
     * }
     */
    @RequestMapping("/request-mapping/bean-transfer")
    public Object saveUser(@RequestBody Website website){
        params.clear();
        params.put("website", website);
        return params;
    }

    /**
     * 功能描述:测试获取http头信息
     * localhost:8081/get-mapping/http-header?id=123456
     * http头含有参数:access-token: my-token
     */
    @GetMapping("/get-mapping/http-header")
    public Object getHeader(@RequestHeader("access-token") String accessToken, String id){
        params.clear();
        params.put("access_token", accessToken);
        params.put("id", id);
        return params;
    }

    /**
     * HttpServletRequest request自动注入获取参数
     * localhost:8081/get-mapping/http-servlet-request?id=myid
     */
    @GetMapping("/get-mapping/http-servlet-request")
    public Object testRequest(HttpServletRequest request){
        params.clear();
        String id = request.getParameter("id");
        params.put("id", id);
        return params;
    }

    /**
     * 功能描述:测试PostMapping
     * localhost:8081/post-mapping/post
     */
    @PostMapping("/post-mapping/post")
    public Object login(String id, String name, String url){
        params.clear();
        params.put("id", id);
        params.put("name", name);
        params.put("url", url);
        return params;
    }

    /**
     * 功能描述:测试PutMapping
     * localhost:8081/put-mapping/put
     */
    @PutMapping("/put-mapping/put")
    public Object put(String id){
        params.clear();
        params.put("id", id);
        return params;
    }

    /**
     * 功能描述:测试DeleteMapping
     * localhost:8081/delete-mapping/del
     */
    @DeleteMapping("/delete-mapping/del")
    public Object del(String id){
        params.clear();
        params.put("id", id);
        return params;
    }
}

Website.java

public class Website {
    private int id;
    private String url;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

application.properties

server.port=8081