В настоящее время у меня действительно странная проблема с вызовом одной службы REST изнутри другой, и я действительно мог бы использовать руку в разработке того, что я делаю неправильно.Spring MVC - вызов службы отдыха изнутри другого сервиса отдыха
Так прежде всего, немного контекста:
У меня есть веб-приложение, которое требует от к службе REST, чтобы создать учетную запись пользователя (для этого объяснения, конечная точка является локальный: 8080/регистр). Раньше в путешествии пользователя я вызывал другую службу, чтобы создать учетные данные пользователя для входа localhost:8090/signup
, но мне нужно проверить несколько вещей в вызове/регистрации, поэтому внутри вызова я звоню в другую конечную точку на 8090, чтобы получить эта информация (localhost:8090/availability
). Короче говоря, webapp вызывает localhost: 8080/register, который, в свою очередь, вызывает localhost:8090/availability
.
Когда я вызываю конечную точку доступности напрямую, либо из клиента REST, либо из самого webapp, все работает так, как ожидалось, но по какой-то странной причине, когда я вызываю его из вызова в конечную точку регистра, я получаю HTTP415. Кто-нибудь знает, что происходит?
Контроллер регистра выглядит следующим образом:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {
// a load of business logic that validates the user model
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
userModel.getUsername(), Boolean.class);
System.out.println(response.getBody());
// a load more business logic
return userModel;
}
И контроллер наличие выглядит следующим образом:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public Boolean isUsernameAvailable(@RequestBody String username) {
// a load of business logic that returns a boolean
return Boolean.TRUE;
}
Полное раскрытие - на практике то, что я показал, как содержание CreateUser () на самом деле несколько вызовов в стек вызовов, используя тот же класс, что и я, для вызова сервисов из webapp (который отлично работает в этом контексте), и я на самом деле не возвращаю true в isUsernameAvailable (потому что это будет глупый), но это самый простой версии кода, который реплицирует проблему.
Мое предположение, что я делаю то, что я собираюсь превзойти, когда увижу это, но я слишком долго смотрел на этот код, чтобы увидеть его больше.
Редактировать Комментарий Vikdor ниже решил эту проблему для меня. Я изменил метод CreateUser на:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {
// a load of business logic that validates the user model
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
userModel.getUsername(), Boolean.class);
System.out.println(response.getBody());
// a load more business logic
return userModel;
}
Код статуса HTTP '415' указывает на неправильный тип носителя, переданный API. Кажется, вы ожидаете приложения/json, но отправляете текст/plain (имя пользователя). Вы можете захотеть установить «MappingJacksonHttpMessageConverter» в шаблон остального и посмотреть, успешно ли этот вызов. – Vikdor
Возможный дубликат [Запрос POST через RestTemplate в JSON] (http://stackoverflow.com/questions/4075991/post-request-via-resttemplate-in-json) –
Спасибо за то, что Vikdor - это решило мою проблему – Rob