【问题标题】:Webhook to collect a JSON: Request method POST not supported收集 JSON 的 Webhook:不支持请求方法 POST
【发布时间】:2019-08-30 11:20:24
【问题描述】:

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

这是一个简化版的控制器,带有Spring注解:

@RestController
public class MyWebhoook {

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

我用 Postman 发送这个 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&lt;String, Object&gt; json

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

我不明白为什么不允许使用 POST 方法。任何帮助,将不胜感激。

【问题讨论】:

  • 尝试用@ResponseBody 标记你的方法,见stackoverflow.com/questions/12837907/…
  • 在那个指向 StackOverflow 的答案中,没有一个建议的解决方案在我身边工作。令人惊讶的是,复制我的代码的其他开发人员可以正常工作。也许问题来自这个 Jackson 类,我的系统将其作为默认值 org.springframework.http.converter.json.MappingJackson2HttpMessageConvert

标签: java json spring spring-security


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我将您的代码复制到我的 Spring Boot 应用程序中,通过邮递员完美运行...

    API:

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

    请求正文:

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

    网址:http://localhost:8080/my-webhook

    尝试:

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

    【讨论】:

    • 我这边可能有问题,因为即使创建一个新的控制器也不起作用。也许您正在使用此 Jackson 课程的替代品:org.springframework.http.converter.json.MappingJackson2HttpMessageConvert,根据我的设置,它将我的系统作为默认值从 Jackson 图书馆获取。
    【解决方案3】:

    问题在于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")
    

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2020-10-29
      • 2016-05-02
      相关资源
      最近更新 更多