SpringBoot中GetMapping如何通过Postman以JSON格式传递参数
解决方案
问题根源
- HTTP规范中,GET请求通常不携带请求体,虽然Postman可以强制发送,但Spring对GET请求的
@RequestBody支持存在局限性。 - 当前直接用
@RequestBody String接收参数时,JSON格式的请求体(如{"email":"xxx@xxx.com"})会被Spring当作完整的字符串值传入,导致查询逻辑无法正确匹配邮箱。
方案一:改用POST请求(推荐,符合REST规范)
查询类接口如果需要传递复杂JSON参数,改用POST更符合行业实践,具体修改步骤如下:
1. 创建参数DTO类
定义一个数据类封装JSON请求参数:
data class EmailRequest( val email: String )
2. 修改Controller方法
将@GetMapping改为@PostMapping,并通过DTO接收JSON参数:
@RestController @RequestMapping("/users") class UserController(@Autowired private val userRepository: UserRepository) { // 其他方法... @PostMapping("/email") fun findByUserEmail(@RequestBody request: EmailRequest): User? = userRepository.findByEmail(request.email) }
3. Postman请求配置
- 请求方法选择
POST - 请求体选择
raw->JSON格式,输入:{"email":"your-email@example.com"} - 请求头设置
Content-Type: application/json
方案二:坚持使用GET请求(不推荐,不符合HTTP规范)
如果业务场景必须使用GET,可通过以下两种方式实现:
方式1:将JSON参数作为请求参数传递
把JSON字符串放在URL的请求参数中,后端解析后获取邮箱:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import org.springframework.web.bind.annotation.RequestParam @RestController @RequestMapping("/users") class UserController(@Autowired private val userRepository: UserRepository) { // 其他方法... @GetMapping("/email") fun findByUserEmail(@RequestParam("query") query: String): User? { val objectMapper = jacksonObjectMapper() val request = objectMapper.readValue<EmailRequest>(query) return userRepository.findByEmail(request.email) } }
Postman配置:
- 请求方法选择
GET - 在
Params中添加键值对:query={"email":"your-email@example.com"}
方式2:强制允许GET请求接收请求体
通过Spring配置开启GET请求的请求体支持(不推荐,可能存在兼容问题):
1. 添加配置类
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter @Configuration class WebConfig { @Bean fun requestMappingHandlerAdapter(): RequestMappingHandlerAdapter { val adapter = RequestMappingHandlerAdapter() // 允许GET请求处理请求体 adapter.setSupportQueryParameters(false) // 添加Jackson JSON转换器 val converters = adapter.messageConverters converters.add(MappingJackson2HttpMessageConverter()) return adapter } }
2. 修改Controller方法
同样使用DTO接收参数:
@GetMapping("/email") fun findByUserEmail(@RequestBody request: EmailRequest): User? = userRepository.findByEmail(request.email)
3. Postman配置
同方案一的请求体配置,选择JSON格式并设置Content-Type: application/json
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

