У меня есть две микросервисы, скажем, Microservice1 вызывает Microservice2 с помощью RestTemplate.
Метод обработчика в Microservice2 таков.
@GetMapping("/careerRoles")
public ResponseEntity<Map<String, Object>> getRole(@RequestParam(value =
"roleName", required = false) String roleName,
@RequestParam(value = "domain", required = false) String domain,
@RequestParam("proficiencyLevel") String proficiencyLevel,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "limit", required = false) Integer limit) {
Map<String, Object> query = new HashMap<>();
Map<String, Object> json = new HashMap<>();
if (page == null && limit == null) {
page = 1;
limit = 10;
}
query.put("page", page);
query.put("limit", limit);
List<Role> roles = new ArrayList<>();
try {
if (roleName == null) {
query.put("proficiencyLevel", proficiencyLevel);
roles = this.roleService.getRolesByProficiencyLevel(proficiencyLevel, page, limit);
} else {
query.put("proficiencyLevel", proficiencyLevel);
query.put("roles", roleName);
roles = this.roleService.getRolesByNameAndProficiencyLevel(roleName, proficiencyLevel, page, limit);
}
json.put("error", null);
json.put("query", query);
json.put("result", roles);
return new ResponseEntity<Map<String, Object>>(json, HttpStatus.OK);
} catch (RoleNotFoundException e) {
json.put("error", e.getMessage());
json.put("query", query);
json.put("result", roles);
return new ResponseEntity<Map<String, Object>>(json, HttpStatus.NOT_FOUND);
}
}
Вызывающий код в Microservice1 таков.
@GetMapping("careerRole")
public ResponseEntity<Map<String,Object>> getCareerRole(
@RequestParam(value = "roleName", required = false) String roleName,
@RequestParam(value = "domain", required = false) String domain,
@RequestParam("proficiencyLevel") String proficiencyLevel,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "limit", required = false) Integer limit) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>("Hello World!",
headers);
UriComponentsBuilder builder = UriComponentsBuilder
.fromUriString(uri)
// Add query parameter
.queryParam("roleName",roleName)
.queryParam("proficiencyLevel", proficiencyLevel);
Map<String,Object> map = restTemplate.getForObject(builder.toUriString(),
Map.class);
return new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK);
}
}
Код работает и возвращает JSON, как ожидалось, когда я отправляю его в Microservice1, прослушивая порт 8081.
http://localhost:8081/api/v1/careerRoles?proficiencyLevel=Novice
Однако, если я отправлю два таких параметра запроса, код не будет выполнен.
http://localhost:8081/api/v1/careerRoles?roleName=Java Developer&proficiencyLevel=Novice
Однако, если я использую Postman для прямого доступа к микросервису 2 с обоими предыдущими запросами GET, результаты будут ожидаемыми.
Что я делаю не так? Заранее благодарю за любую помощь.
Используйте метод urlencoder.encode () для кодирования полного URL-адреса. Я думаю, что проблема возникает из-за пробела между Java и разработчиком
На самом деле decode () помогло. Параметр запроса имел форму roleName = Java% 20Developer. После декодирования он стал roleName = Java Developer (с пробелом), и это сработало. Хотя странно.
На самом деле я все равно перепутал клиентский код и серверный, думаю, мой намек сработал .. Gr8
Я уже сталкивался с этой проблемой раньше.
Пробел между java и разработчиком может создать проблему, поэтому расшифруйте его, прежде чем продолжить.
не могли бы вы добавить трассировку стека сбоев?