Java - метод RestTemplate 405 не разрешен, хотя вызов почтальона работает - PullRequest
0 голосов
/ 08 февраля 2019

У меня странная проблема при работе с RestTemplate.Я использую определенный REST API и хочу обновить что-то, используя PUT.Таким образом, например, Почтальон я отправляю этот запрос:

PUT http://fake/foobar/c/123 with a certain body

Это обновление через Почтальон успешно.Если теперь я выполняю тот же вызов в Java через RestTemplate, я получаю метод 405 Not Allowed:

HttpHeaders headers = createHeader();
HttpEntity<Offer> httpEntity = new HttpEntity<>(bodyEntity, headers);
String url = "http://fake/foobar/c/123"; //Created dynamically, but here pasted for sake of simplicity
RestTemplate restTemplate = new RestTemplate(...);
ResponseEntity<OfferResponse> response = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, OfferResponse.class);
...

Я сравнивал URL снова и снова.Если я скопирую URL-адрес, зарегистрированный в консоли, и скопирую его в Postman, я смогу выполнить обновление успешно.Я также сравнил заголовки и все.Все равно, как это делается через Почтальон.

Есть ли потенциальная другая причина для такого поведения (другая причина, чем я слишком глуп, сравнивая заголовки и т. Д. И что-то упустив)?Другие вызовы PUT, POST и т. Д. Для этого API работают нормально, в противном случае я бы предположил, что при использовании RestTemplate

существует общая проблема

1 Ответ

0 голосов
/ 08 февраля 2019

Код 405 Method Not Allowed означает, что HTTP-глагол (GET, POST, PUT и т. Д.), Который вы используете для этой конечной точки, известен, но не принят API.

Если вы не можете опубликоватьПодробно о вашем API, как предложил @Dinesh Singh Shekhawat, сначала я попытаюсь использовать функцию Postman Code и получить автоматически сгенерированный код для Java (OkHTTP или UniRest) запроса.Вы можете найти эту опцию в правой части под кнопкой Отправить .Скопируйте этот код и попробуйте выполнить запрос.

enter image description here

Затем сравните этот запрос с вашим.

Вы всегда можете использовать HttpPut вместо RestTemplate, если это не является обязательным требованием:

HttpClient client = HttpClientBuilder.create().build();
String url = "http://fake/foobar/c/123";

HttpHeaders headers = createHeader();
HttpEntity<Offer> httpEntity = new HttpEntity<>(bodyEntity, headers);
HttpPut httpPut = new HttpPut(url);
httpPut.setEntity(httpEntity);

HttpResponse response = client.execute(httpPut);

...