2015-12-29 2 views
4

В настоящее время у меня действительно странная проблема с вызовом одной службы 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; 
} 
+1

Код статуса HTTP '415' указывает на неправильный тип носителя, переданный API. Кажется, вы ожидаете приложения/json, но отправляете текст/plain (имя пользователя). Вы можете захотеть установить «MappingJacksonHttpMessageConverter» в шаблон остального и посмотреть, успешно ли этот вызов. – Vikdor

+0

Возможный дубликат [Запрос POST через RestTemplate в JSON] (http://stackoverflow.com/questions/4075991/post-request-via-resttemplate-in-json) –

+0

Спасибо за то, что Vikdor - это решило мою проблему – Rob

ответ

0

HTTP415 означает неподдерживаемый тип медиа. Это означает, что isUsernameAvailable ожидает ввода в формате JSON, но это не то, что он получает.

Попробуйте явно добавляя Content-Type: application/json заголовок на запрос HTTP, выполнив следующие действия:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers); 
restTemplate.put(uRL, entity); 
0

Использование RestTemplate.exchange указанных ниже:

ResponseEntity responseEntity = RestTemplate.exchange (endPointURL, HttpMethod.GET/POST/PUT/DELETE, HttpEntity/заголовки, uriVariables)

endpointURL - SOAP Конечная точка UR L, что служба REST должна потреблять.

HTTPMethod - Тип Метод, такие как GET, PUT, POST, DELETE и т.д.

HTTPEntity - Мыло требует обязательного отправителя/заголовков/{а} Убеждайтесь, что вы установили свой заголовок имя и значение в качестве пары ключ-Valye в заголовках HTTP.

uriVariables - (Object ... urivariables), такие как String.class, Integer.class

Вы должны также поставить ConnectTimeout, isSSLDisabled, responseCached в конструкторе при создании запрос на restTemplate.

Смежные вопросы