From cd654c9e20b3e5390910290f144d5c0bb634f0f9 Mon Sep 17 00:00:00 2001 From: Forb Yuan Date: Tue, 26 Dec 2023 12:03:02 +0800 Subject: [PATCH] BAEL-6080: Getting Query String Parameters from HttpServletRequest --- .../requestparam/QueryStringController.java | 64 +++++++++++++++++++ .../com/baeldung/requestparam/UserDTO.java | 24 +++++++ .../QueryStringControllerIntegrationTest.java | 64 +++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/QueryStringController.java create mode 100644 spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/UserDTO.java create mode 100644 spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestparam/QueryStringControllerIntegrationTest.java diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/QueryStringController.java b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/QueryStringController.java new file mode 100644 index 0000000000..6c7c5aad43 --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/QueryStringController.java @@ -0,0 +1,64 @@ +package com.baeldung.requestparam; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@RestController +public class QueryStringController { + + @GetMapping("/api/user0") + public String byGetQueryString(HttpServletRequest request) { + return request.getQueryString(); + } + + @GetMapping("/api/user1") + public String byGetParameter(HttpServletRequest request) { + String username = request.getParameter("username"); + return "username:" + username; + } + + @GetMapping("/api/user2") + public String byGetParameterValues(HttpServletRequest request) { + String[] roles = request.getParameterValues("roles"); + return "roles:" + Arrays.toString(roles); + } + + @GetMapping("/api/user3") + public UserDTO byGetParameterMap(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + String[] usernames = parameterMap.get("username"); + String[] roles = parameterMap.get("roles"); + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(usernames[0]); + userDTO.setRoles(Arrays.asList(roles)); + return userDTO; + } + + @GetMapping("/api/user4") + public UserDTO byParameterName(String username, String[] roles) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(username); + userDTO.setRoles(Arrays.asList(roles)); + return userDTO; + } + + @GetMapping("/api/user5") + public UserDTO byRequestParamAnnotation(@RequestParam("username") String var1, @RequestParam("roles") List var2) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(var1); + userDTO.setRoles(var2); + return userDTO; + } + + @GetMapping("/api/user6") + public UserDTO byPojo(UserDTO userDTO) { + return userDTO; + } + +} diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/UserDTO.java b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/UserDTO.java new file mode 100644 index 0000000000..847411936a --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/requestparam/UserDTO.java @@ -0,0 +1,24 @@ +package com.baeldung.requestparam; + +import java.util.List; + +public class UserDTO { + private String username; + private List roles; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } +} diff --git a/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestparam/QueryStringControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestparam/QueryStringControllerIntegrationTest.java new file mode 100644 index 0000000000..95ca3599df --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-5/src/test/java/com/baeldung/requestparam/QueryStringControllerIntegrationTest.java @@ -0,0 +1,64 @@ +package com.baeldung.requestparam; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import static org.hamcrest.Matchers.containsInRelativeOrder; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup; + + +@SpringBootTest +@AutoConfigureMockMvc +class QueryStringControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + this.mockMvc = standaloneSetup(new QueryStringController()).build(); + } + + @Test + public void whenInvokeGetQueryString_thenReturnTheOriginQueryString() throws Exception { + this.mockMvc.perform(get("/api/user0?username=bob&roles=admin&roles=stuff")) + .andExpect(status().isOk()) + .andExpect(content().string("username=bob&roles=admin&roles=stuff")); + } + + @Test + public void whenInvokeGetQueryParameter_thenReturnOneParameterValue() throws Exception { + this.mockMvc.perform(get("/api/user1?username=bob")) + .andExpect(status().isOk()) + .andExpect(content().string("username:bob")); + } + + @Test + public void whenInvokeGetParameterValues_thenReturnParameterAsArray() throws Exception { + this.mockMvc.perform(get("/api/user2?roles=admin&roles=stuff")) + .andExpect(status().isOk()) + .andExpect(content().string("roles:[admin, stuff]")); + } + + @ParameterizedTest + @CsvSource(textBlock = """ + /api/user3 + /api/user4 + /api/user5 + /api/user6 + """) + public void whenPassParameters_thenReturnResolvedModel(String path) throws Exception { + this.mockMvc.perform(get(path + "?username=bob&roles=admin&roles=stuff")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.username").value("bob")) + .andExpect(jsonPath("$.roles").value(containsInRelativeOrder("admin", "stuff"))); + } +} \ No newline at end of file