Я пишу контроллер с Java для URL-адреса веб-перехватчика, который получает вызов метода POST с телом 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
Я пробовал эти разные подходы с тем же результатом:
@RequestMapping(value = "/my-webhook", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
вместо аннотации @PostMapping("/my-webhook")
.
Моделирование полученного JSON как java-объекта вместо Map<String, Object> json
.
Я не понимаю, почему метод POST не разрешен. Любая помощь будет очень высоко ценится.
Ни одно из предложенных решений в указанном ответе StackOverflow не работает на моей стороне. Удивительно, но другие разработчики, копирующие мой код, заставляют его работать. Возможно, проблема связана с этим классом Джексона, который моя система принимает по умолчанию org.springframework.http.converter.json.MappingJackson2HttpMessageConvert
Я скопировал ваш код в свое весеннее загрузочное приложение, отлично работал через почтальона...
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
}
URL-адрес: http://localhost:8080/мой-вебхук
Попробуй:
Что-то может быть не так на моей стороне, потому что даже создание нового контроллера не работает. Возможно, вы используете альтернативу этому классу Джексона: org.springframework.http.converter.json.MappingJackson2HttpMessageConvert
, который получает мою систему по умолчанию из библиотеки Джексона в соответствии с моими настройками.
Проблема была с Конфигурация безопасности CSRF (подделка межсайтовых запросов). Путь веб-перехватчика должен быть выведен из-под контроля CSRF. В противном случае запрос POST не проходит контроль CSRF.
Это упрощенная выдержка из настроек безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http)throws Exception{
http
.csrf()
.ignoringAntMatchers("/my/webhook")
Попробуйте пометить свой метод @ResponseBody, см. stackoverflow.com/questions/12837907/…