【问题标题】:How to catch what is POST'ed to rest api如何捕捉发布到休息 api 的内容
【发布时间】:2019-05-04 03:53:07
【问题描述】:

我在 api/books 设置了一个 rest api,可以在那里发送一个新的 book 对象,它将被添加到数据库中。问题是,我怎样才能正确地捕捉到正在发布的内容,以便例如验证正在发送的内容?

@RequestMapping(value="/api/books", method = RequestMethod.POST)
public String bookSavePost(@RequestBody Book book) {
    bookRepository.save(book);
    return "redirect:/api/books";
}  

这很有效,因为它保存了这本书,我可以捕捉到用户发送的内容,但是启用此功能后,它会覆盖默认的 REST 方法,该方法不允许人们再实际查看 api。如果我将此特定方法更改为 GET,它会返回一个字符串“redirect:/api/books”,因此它甚至不会重定向任何内容。有什么方法可以将其实际重定向到其余 api 端点?

【问题讨论】:

  • 你可以试试@PostMapping("/api/books")
  • 就像用 PostMapping 替换 RequestMapping 一样?那没有用。 PostMapping 不只是 @RequestMapping(value="/api/books", method = RequestMethod.POST) 的快捷方式吗
  • 是的,但它也设置了@RequestMapping(value="/api/books", method = RequestMethod.POST, consumer = "application/json",produces="application/json")。我认为consumers 属性的缺失是您的问题

标签: spring rest api


【解决方案1】:

您可以编写自己的请求拦截器。

Spring提供了HandlerInterceptor类:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

以下是如何执行此操作的快速示例: https://www.baeldung.com/spring-mvc-handlerinterceptor

【讨论】:

  • 谢谢,我明天去看看。
  • 我毕竟没必要这样做(这只是一个糟糕的学校项目,我不想参与太深),但可以这样做。跨度>
【解决方案2】:

重定向需要三两件事才能成功:HTTP 代码 301 或 302 以及包含您希望客户端访问的端点的 location 标头。

例如,在标题部分你应该有

location: '/correct/endpoint'

【讨论】:

  • 好吧,这仍然意味着我会得到“不支持 GET”,因为它只会再次将自己重定向到 GET 方法 - 并且调用 POST 需要您有与 @RequestBody Book 匹配的内容书。这就是我所做的: response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); response.setHeader("位置", "/api/books");
  • 我一定误解了你的问题。您是说当用户向该端点发送 GET 时您试图强制 POST 吗?
  • 我只是想尽办法让它工作,从 GET 方法发送 POST 请求可能是一回事。只是我一开始不知道rest api是如何工作的,它似乎只是神奇地在后台运行。我只是想抓住正在发布到休息 api 的内容。
  • 我认为问题的一部分在于,当您定义自定义方法时,它只是覆盖了 rest api 中的任何黑魔法。重定向会导致它一遍又一遍地重定向到同一个新定义的方法..
  • @ivaylo 我希望它重定向到同一个 api,但只需对正在发布的内容做一些事情。
猜你喜欢
  • 2020-10-19
  • 2017-10-26
  • 2016-10-07
  • 1970-01-01
  • 2011-07-20
  • 2012-12-23
  • 2015-01-01
  • 2020-05-14
  • 2019-03-13
相关资源
最近更新 更多