spring 控制器返回 404 并带有 post 和 file 以生成响应实体
Posted
技术标签:
【中文标题】spring 控制器返回 404 并带有 post 和 file 以生成响应实体【英文标题】:spring controller returns 404 with post and file with get to generate responseentity 【发布时间】:2017-04-06 00:25:45 【问题描述】:我有一个使用 @RestController 注释的控制器,并且映射返回 ResponseEntity 和 spring 4.3
该方法接收带有数据的表单以生成文件,但是如果我使用 GET 方法 url 请求文件它会生成文件,但是如果我使用 POST 方法 url 请求文件,spring 返回 404
@RequestMapping("/request")
@RestController
MyController
@RequestMapping("/notes.do")
ResponseEntity<byte[]> notes(HttpServletRequest request, HttpServletResponse response, Principal principal, NotesForm form)
return createResponseEntity(form);
我从 weblogic 的 access.log 中得到这个
127.0.0.1 - - [05/abr/2017:19:11:06 -0500] "GET /app-web/request/notes.do?noteType=DATA¬eContent=HELLO HTTP/1.1" 201 35602
127.0.0.1 - - [05/abr/2017:19:12:29 -0500] "POST /app-web/request/notes.do HTTP/1.1" 404 1322
这是获取请求的请求标头
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,es;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Cookie:theme=siirfe-pink; SIIRFESESS=XKdAssgx6p_kr8OFTRqYQa7IKG8nrIXZr5lO1Ns8lpWE1pFSqfwf!-2083194325!NONE
Host:wlcap1:9102
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.
以及post请求的请求头
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8,es;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Content-Length:103
content-type:application/x-www-form-urlencoded;charset=UTF-8
Cookie:theme=siirfe-pink; SIIRFESESS=XKdAssgx6p_kr8OFTRqYQa7IKG8nrIXZr5lO1Ns8lpWE1pFSqfwf!-2083194325!NONE
Host:wlcap1:9102
Origin:http://wlcap1:9102
Pragma:no-cache
Referer:http://wlcap1:9102/app-web/dictaminacion
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
这是获取请求的响应:
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Disposition:form-data; name="attachment"; filename="ARCHIVO.DOCX"
Content-Length:35602
Content-Type:application/docx
Date:Thu, 06 Apr 2017 00:39:04 GMT
Expires:0
Pragma:no-cache
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-ORACLE-DMS-ECID:8ac7d542-7157-4b0a-8190-f8e69f03a454-00001af0
X-ORACLE-DMS-RID:0
X-XSS-Protection:1; mode=block
post 请求的响应只是一个错误页面。
有什么方法可以让我从发布请求中获取文件还是我遗漏了什么?
根据日志,在这两种情况下一切似乎都很好(控制器运行直到两种情况下的请求返回)
发布请求时响应实体上的内容:
201 Created,[B@1e6804c8,Content-Type=[application/docx], Content-Disposition=[form-data; name="attachment"; filename="ARCHIVO.DOCX"]
获取请求时响应实体上的内容:
201 Created,[B@39cb5a1a,Content-Type=[application/docx], Content-Disposition=[form-data; name="attachment"; filename="ARCHIVO.DOCX"]
我没有发现任何错误信息。
【问题讨论】:
请完整显示/...
。另请注意,通常不鼓励使用 HttpServletRequest
/Response
,因为 Spring 为您想要的几乎所有内容提供了神奇的类型安全绑定。
是的。在 Spring 构建 RESTful Web 服务的方法中,HTTP 请求由 @RestController
注释标识的控制器处理。使用@RequestParam
或@PathVariable
获取参数。
在 404 回电的 URL 中多了一个/
,这是您的问题中的拼写错误,还是答案?
这是一个错字
@RequestMapping("/requests")
和/app-web/request/..
的区别是不是也是笔误?请修复这些,这会让一切变得更加混乱。使用相同的代码,它在我的本地工作,无法找出原因。
【参考方案1】:
更改发布请求上的 Accept 标头解决了该问题。 我不确定为什么这是一个问题,因为它列出了 */ * (忽略空格,不知道如何让评论正确显示)作为最后一个选项,但是删除了 application/json 和 text/plain 解决了问题
【讨论】:
以上是关于spring 控制器返回 404 并带有 post 和 file 以生成响应实体的主要内容,如果未能解决你的问题,请参考以下文章
带有 Maven Shade 插件的 Spring Boot - 未映射控制器(404 错误)
Spring Boot POST 请求返回 http 状态 405“方法不允许”而不是 HTTP 状态 404
Spotify Web API 返回 404 并带有有效的节目 ID