Partner – Microsoft – NPI (cat= Spring)
announcement - icon

Azure Spring Apps is a fully managed service from Microsoft (built in collaboration with VMware), focused on building and deploying Spring Boot applications on Azure Cloud without worrying about Kubernetes.

And, the Enterprise plan comes with some interesting features, such as commercial Spring runtime support, a 99.95% SLA and some deep discounts (up to 47%) when you are ready for production.

>> Learn more and deploy your first Spring Boot app to Azure.

You can also ask questions and leave feedback on the Azure Spring Apps GitHub page.

1. Overview

In this quick tutorial, we’ll explore the differences between Spring’s @RequestParam and @PathVariable annotations.

@RequestParam and @PathVariable can both be used to extract values from the request URI, but they are a bit different.

Further reading:

Validating RequestParams and PathVariables in Spring

Learn how to validate request parameters and path variables with Spring MVC

Spring's RequestBody and ResponseBody Annotations

Learn about the Spring @RequestBody and @ResponseBody annotations.

Using Spring @ResponseStatus to Set HTTP Status Code

Have a look at the @ResponseStatus annotation and how to use it to set the response status code.

2. Query Parameter vs URI Path

While @RequestParams extract values from the query string, @PathVariables extract values from the URI path:

@GetMapping("/foos/{id}")
@ResponseBody
public String getFooById(@PathVariable String id) {
    return "ID: " + id;
}

Then we can map based on the path:

http://localhost:8080/spring-mvc-basics/foos/abc
----
ID: abc

And for @RequestParam, it will be:

@GetMapping("/foos")
@ResponseBody
public String getFooByIdUsingQueryParam(@RequestParam String id) {
    return "ID: " + id;
}

which would give us the same response, just a different URI:

http://localhost:8080/spring-mvc-basics/foos?id=abc
----
ID: abc

3. Encoded vs Exact Value

Because @PathVariable is extracting values from the URI path, it’s not encoded. On the other hand, @RequestParam is encoded.

Using the previous example, ab+c will return as-is:

http://localhost:8080/spring-mvc-basics/foos/ab+c
----
ID: ab+c

But for a @RequestParam request, the parameter is URL decoded:

http://localhost:8080/spring-mvc-basics/foos?id=ab+c
----
ID: ab c

4. Optional Values

Both @RequestParam and @PathVariable can be optional.

We can make @PathVariable optional by using the required attribute starting with Spring 4.3.3:

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
@ResponseBody
public String getFooByOptionalId(@PathVariable(required = false) String id){
    return "ID: " + id;
}

Then we can do either:

http://localhost:8080/spring-mvc-basics/myfoos/optional/abc
----
ID: abc

or:

http://localhost:8080/spring-mvc-basics/myfoos/optional
----
ID: null

For @RequestParam, we can also use the required attribute.

Note that we should be careful when making @PathVariable optional, to avoid conflicts in paths.

5. Conclusion

In this article, we learned the differences between @RequestParam and @PathVariable.

The full source code for the examples can be found over on GitHub.

Course – LS (cat=Spring)

Get started with Spring and Spring Boot, through the Learn Spring course:

>> THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.