@RequestBody MultiValueMap 不支持内容类型“application/x-www-form-urlencoded;charset=UTF-8”

新手上路,请多包涵

基于 problem with x-www-form-urlencoded with Spring @Controller 的答案

我写了下面的 @Controller 方法

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
            , produces = {"application/json", "application/xml"}
            ,  consumes = {"application/x-www-form-urlencoded"}
    )
     public
        @ResponseBody
        Representation authenticate(@PathVariable("email") String anEmailAddress,
                                    @RequestBody MultiValueMap paramMap)
                throws Exception {

            if(paramMap == null || paramMap.get("password") == null) {
                throw new IllegalArgumentException("Password not provided");
            }
    }

请求失败并出现以下错误

{
  "timestamp": 1447911866786,
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path": "/users/usermail%40gmail.com/authenticate"
}

[PS: Jersey 更友好,但由于这里的实际限制现在无法使用它]

原文由 Somasundaram Sekar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 952
2 个回答

问题是当我们使用 application/x-www-form-urlencoded 时,Spring 不会将其理解为 RequestBody。所以,如果我们想使用它,我们必须删除 @RequestBody 注释。

然后尝试以下操作:

 @RequestMapping(
  path = "/{email}/authenticate",
  method = RequestMethod.POST,
  consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
  produces = {
    MediaType.APPLICATION_ATOM_XML_VALUE,
    MediaType.APPLICATION_JSON_VALUE
  })
public @ResponseBody Representation authenticate(
  @PathVariable("email") String anEmailAddress,
  MultiValueMap paramMap) throws Exception {

  if (paramMap == null &&
      paramMap.get("password") == null) {
     throw new IllegalArgumentException("Password not provided");
  }
  return null;
}

请注意,删除了注释 @RequestBody

_答案_: 内容类型为 application/x-www-form-urlencoded 的 Http Post 请求在 Spring 中不起作用

原文由 Douglas Ribeiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

似乎现在您只需将方法参数标记为 @RequestParam 完成这项工作。

 @PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
  //work with Map
}

原文由 Scadge 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题