Search code examples
spring-boothttp-postmicroservicesurl-parameters

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


The application requires driver and their locations to be registered. There are two api's one to register driver and one to save location.

The api's are

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

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

The first api will request, response structure is as below

Request:

{
    "name": "Rakesh123",
    "email":"[email protected]",
    "phone_number":9876899979,
    "license_number":"DL12CDRWG1",
    "car_number":"DL1T43241"
}

Response:

{
    "driverId": 2,
    "name": "Rakesh123",
    "email": "[email protected]",
    "phone_number": "9876899979",
    "license_number": "DL12CDRWG1",
    "car_number": "DL1T43241",
    "location": null
 }

In the second api, the ":id" will be the driver id received and contains the request body with latitude and longitude

Request:

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

I am facing problem while reading the ":id" parameter from request. I tried printing the request URI value and that's how the request is coming

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

The methods are written as below

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;
}

Will appreciate help


Solution

  • Your code looks fine to me. Maybe it's a problem with the client that sends the request? Did it realy contains the Id value in the URL?

    Here a small example with spring boot that reads the Id and print to console:

    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>