如何通过 spring 引导中的 POST 方法读取 url 中的参数

How to read a parameter in url coming via POST method in spring boot

该应用程序需要 driver 及其位置进行注册。有两个api,一个用来注册driver,一个用来保存位置。

api 是

  1. POST /api/v1/driver/register/

  2. POST /api/v1/driver/:id/sendLocation/

第一个api会请求,响应结构如下

要求:

{
    "name": "Rakesh123",
    "email":"rakesh@abc1.com",
    "phone_number":9876899979,
    "license_number":"DL12CDRWG1",
    "car_number":"DL1T43241"
}

响应:

{
    "driverId": 2,
    "name": "Rakesh123",
    "email": "rakesh@abc1.com",
    "phone_number": "9876899979",
    "license_number": "DL12CDRWG1",
    "car_number": "DL1T43241",
    "location": null
 }

在第二个 api 中,":id" 将是收到的 driver id 并包含带有纬度和经度的请求正文

要求:

{
    "latitude": 12.972442,   
    "longitude": 77.580643  
}

我在从请求中读取“:id”参数时遇到问题。我尝试打印请求 URI 值,这就是请求的来源

/api/v1/driver/$id/sendLocation/

写法如下

1.

@PostMapping("/register")
public ResponseEntity<?> registerDriver(@RequestBody DriverDetails driver){
    responseMap = new HashMap<>();
    try {
        DriverDetails registeredDriver = service.registerDriver(driver);
        
        
        responseMap.put("driver", registeredDriver);
        
        responseEntity = new ResponseEntity<>(responseMap, HttpStatus.CREATED);
    }catch(Exception e) {
        responseMap.put("status", "failure");
        responseMap.put("reason", e.getMessage());
        responseEntity = new ResponseEntity<>(responseMap, HttpStatus.BAD_REQUEST);
    }
    
    return responseEntity;
}
@PostMapping("/{id}/sendLocation")
public ResponseEntity<?> saveDriverLocation(@PathVariable String id, @RequestBody Location location){
    
    responseMap = new HashMap<>();
    try {
        service.addLocation(Integer.parseInt(id), location);
        responseMap.put("status", "success");
        
        responseEntity = new ResponseEntity<>(responseMap, HttpStatus.ACCEPTED);
    }catch(Exception e) {
        responseMap.put("status", "failure");
        responseMap.put("reason", e.getMessage());
        responseEntity = new ResponseEntity<>(responseMap, HttpStatus.BAD_REQUEST);
    }
    
    return responseEntity;
}

感谢帮助

我觉得你的代码没问题。也许是发送请求的客户端有问题?它真的包含 URL 中的 Id 值吗?

这里有一个 spring 启动的小例子,它读取 Id 并打印到控制台:

DemoApplication.java

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

ExampleController.java

@RestController
@RequestMapping("/api/v1/driver")
public class ExampleController {
    /**
     * Call this Endpoint with e.g. http://localhost:8080/api/v1/driver/123/sendLocation
     */
    @PostMapping("/{id}/sendLocation")
    public ResponseEntity saveDriverLocation(@PathVariable String id, @RequestBody String location) {
        System.out.println("received id: " + id);
        System.out.println("received location: "+ location);
        return ResponseEntity.ok().build();
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>