我正在用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
我尝试了这些不同的方法,结果相同:
@RequestMapping(value = "/my-webhook", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
而不是@PostMapping("/my-webhook")
注释。
将接收到的JSON建模为java对象而不是Map<String, Object> json
。
我不明白不允许使用POST方法的原因。任何帮助,将不胜感激。
答案 0 :(得分:1)
答案 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
尝试:
答案 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")