【问题标题】:How to read a parameter in url coming via POST method in spring boot如何在spring boot中通过POST方法读取url中的参数
【发布时间】:2021-01-29 18:45:10
【问题描述】:

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

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" 将是接收到的驱动程序 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;
}

感谢帮助

【问题讨论】:

    标签: spring-boot http-post microservices url-parameters


    【解决方案1】:

    您的代码对我来说看起来不错。也许是发送请求的客户端有问题?是否真的在 URL 中包含 Id 值?

    这里有一个使用 Spring Boot 读取 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>
    

    【讨论】:

    • 嗨奥利弗,感谢您的回复。客户端期望注册驱动程序 api 的响应应包含在响应 json 中,因此客户端无法将生成的 id 传递回第二个请求。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2022-08-20
    • 2018-10-25
    • 2017-01-03
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多