【问题标题】:REST method's won't PUT or POST to the serverREST 方法不会 PUT 或 POST 到服务器
【发布时间】:2011-10-21 13:37:23
【问题描述】:

我正在尝试让一些 REST 方法在我的 Spring 应用程序中运行,但似乎收效甚微。我显然错过了一些东西,但我无法告诉我这将是什么。这是我的控制器:

@Controller
public class IndexController {
    static Logger log = Logger.getLogger(IndexController.class);

    @Autowired
    private ProvisionService provisionService;

    @RequestMapping(value="/home/data", method=RequestMethod.GET,
                    headers="Accept=application/json")
    public @ResponseBody List<Provision> getData() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = null;

        if(principal instanceof UserDetails)
            username = ((UserDetails)principal).getUsername();

        return provisionService.getAllByUser(username);
    }

    //JSON put request - doesn't work currently
    @RequestMapping(value="/home/data", method=RequestMethod.PUT,
                    headers="Content-Type=application/json")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void updateProvisions(@RequestBody List<Provision> provisions) {
        log.info("Provisions: " + provisions.toString());
    }

    @RequestMapping(value={"/","/home"}, method=RequestMethod.GET)
    public void showIndex() {}
}

这是使用它的 JSP 的主要部分:

<sf:form id="homeForm" method="put" action="${homeData_url}"></sf:form>

当用户单击按钮时,表单通过 Javascript 提交。无论如何,对于 GET 来说一切正常。我让 Json 和我的对象列表一起返回,没有问题。然后我使用 Dojo 来展示它,到目前为止一切都很好。但是,当我尝试使用此表单返回 Json 时,我收到 405 - Request method 'POST' not supported 错误。如您所见,我的控制器中有方法处理程序,所以我真的不确定我做错了什么。我已经从 Spring in Action 3 书中删除了这些处理程序,它也类似于一些 Spring 文档和内容所说的,但显然我缺少一个关键组件。有人有什么想法吗?

我的 web.xml 中确实有 HiddenHttpMethodFilter 映射,这就是我使用 Spring 表单标签的原因。

无论如何,感谢您的任何想法或帮助。谢谢。

------------------更新------------------

这是我单击按钮并收到 405 错误后的标题(如果有帮助):

http://localhost:8080/NFI/home

POST /NFI/home HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Referer: http://localhost:8080/NFI/home
Cookie: JSESSIONID=584AC21ADE4F214904B9E7E2370363EF
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

HTTP/1.1 405 Method Not Allowed
Server: Apache-Coyote/1.1
Allow: GET, PUT
Content-Type: text/html;charset=utf-8
Content-Length: 1085
Date: Fri, 21 Oct 2011 15:39:26 GMT

【问题讨论】:

  • >但是,当我尝试使用此表单返回 Json 时,我收到了 405... 您发送的请求看起来如何。
  • 去掉headers="Content Type=application/json"约束还能用吗?
  • @Ralph 不,同样的结果。此外,是否有必要让它知道它正在获取 Json 对象并可以对其进行解码?
  • 对“/home/data”的 Json 请求。它真的包含更改方法(HiddenHttpMethodFilter)的参数吗?请用一些工具检查这个或在HiddenHttpMethodFilter中设置一个断点
  • 当我检查 JSP 的源代码时,它确实创建了一个具有适当值的隐藏输入。所以是的,我假设它确实如此。但是,我不会在服务器端重新使用该方法,以便能够进一步评估。

标签: spring rest spring-mvc


【解决方案1】:

使用 POST 提交表单。您收到“POST”不支持错误。

在上面,我看到您在源代码中使用了 RequestMethod.PUT。根本没有提到 POST。

【讨论】:

  • 这是 Spring 为您所做的一部分。因为我使用的是 HiddenHttpMethodFilter 和 Spring Form 标记,所以它会为我处理这部分。表单使用 POST 呈现,隐藏值为 PUT,Spring 为您翻译它。我不需要寻找 POST 的处理程序。无论如何,我想到了这一点,并尝试将我的 RequestMethod 更改为 POST,但我得到了完全相同的结果。
  • 我不知道。谢谢!
【解决方案2】:

添加您需要在您的请求中添加一个参数_method,其值为PUT。不是json内容!

所以在第一步中,我会将请求的 URL 更改为 /home/data?_method=PUT

如果这项工作你可以搜索一种方法如何将_method 参数添加到请求内容而不干扰Json 数据。

【讨论】:

  • 不,这没有任何作用。我很确定由于 Spring 和 HiddenHttpMethodFilter,_method 已经在请求中。但我试了一下,收到了完全相同的问题。谢谢你的想法。对我来说,我并没有以某种方式发回 Json 对象似乎很奇怪,但是在所有示例中,我似乎都没有比我做的更多。
  • @cardician: 可能你有几个问题,但是如果你不提交_method 参数,HiddenHttpMethodFilter 什么都做不了
【解决方案3】:

您使用标头更新了您的问题,您是否也可以将整个请求放在那里(实际转储值)以查看正在发送的 _method 参数?

另外,虽然我猜 headers=""-rules 是有效的,但它们不应该被需要。您有一个 json 转换器 bean,它将根据内容类型进行编组和解组并接受标头,如果没有找到有效的转换器,Spring 将返回错误。

将它包含在@RequestMapping 中的唯一原因是,如果你有一个方法实际上做了其他事情,如果你用 xml 而不是 json 调用它,这听起来像是一个糟糕的设计。

删除那些标题规则并重试,使其尽可能简单并逐渐添加逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2016-09-27
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多