Webhook收集JSON:不支持请求方法POST

时间:2019-04-09 08:21:36

标签: java json spring spring-security

我正在用Java编写一个用于Webhook URL的控制器,该URL接收我需要收集的带有JSON正文的POST方法调用。

这是控制器的简化版本,带有Spring注释:

@RestController
public class MyWebhoook {

    @PostMapping("/my-webhook")
    public void getMyJson(@RequestBody Map<String, Object> json) {
    System.out.println("WebHook collected JSON: " + json);
    }
}

我用邮递员发送此JSON对其进行了测试:

Header: Content-Type / application/json

{
    "webhookKey" : "tranviaVermellCostaAvall", 
    "token" : "xx",
    "channelId": 1,
    "propertyId": "999999",
    "status": "new",
    "reservationId": "111211221",
    "reservationStatus" : 1
}

我得到这个答案:

{
    "timestamp": "2019-04-09T07:23:38.093+0000",
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "path": "/my-webhook"
}

服务器日志,提供了更多信息:

Request method 'POST' not supported, path=/my-webhook}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7756c3cd

我尝试了这些不同的方法,结果相同:

  1. @RequestMapping(value = "/my-webhook", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)而不是@PostMapping("/my-webhook")注释。

  2. 将接收到的JSON建模为java对象而不是Map<String, Object> json

  3. 使用HttpServletRequest而不是@RequestBody批注,尝试将请求作为字符串读取。

我不明白不允许使用POST方法的原因。任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

我在您的方法之间添加了{},并获得200作为回报。我在下面添加了有关我得到的代码,请求和控制台输出的图片。

Code and request console

答案 1 :(得分:1)

我将您的代码复制到了我的spring boot应用程序中,通过邮递员可以完美运行...

API:

@PostMapping("/my-webhook")
  public void getMyJson(@RequestBody Map<String, Object> json) {
  System.out.println("WebHook collected JSON: " + json);
}

RequestBody:

{
    "webhookKey" : "tranviaVermellCostaAvall", 
    "token" : "xx",
    "channelId": 1,
    "propertyId": "999999",
    "status": "new",
    "reservationId": "111211221",
    "reservationStatus" : 1
}

URL:http://localhost:8080/my-webhook

尝试:

  • 更新并清理您的项目。
  • 使IDE缓存无效并重新启动它,然后重试。

答案 2 :(得分:0)

问题在于 CSRF(跨站点请求伪造)安全配置。 Webhook的路径必须从CSRF控件中删除。否则,POST请求不会通过CSRF控件。

这是安全设置的简化摘录:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http)throws Exception{
        http
            .csrf()
                 .ignoringAntMatchers("/my/webhook")