Webhook для сбора JSON: метод запроса POST не поддерживается - PullRequest
0 голосов
/ 09 апреля 2019

Я пишу контроллер с Java для URL-адреса webhook, который получает вызов метода 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);
    }
}

Я проверяю это с почтальоном, отправляющим этот 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 ]

1 голос
/ 09 апреля 2019

Я скопировал ваш код в мое весеннее загрузочное приложение, отлично работал через почтальона ...

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, перезапустите его и повторите попытку.
1 голос
/ 09 апреля 2019

Я добавил {} между вашим методом и получил 200 в качестве возврата. Я добавил картинки ниже, чтобы узнать какой код, запрос и вывод на консоль я получил.

Code and request console

0 голосов
/ 10 апреля 2019

Проблема была в конфигурации безопасности 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...