Вопрос несколько отличается от RestTemplate Spring: сложный объект для запроса параметров Предположим, существует запрос, который принимает некоторые параметры в виде объекта:
@GetMapping("getRoute")
public ActionResult<Response> get(@Validated GetRequest req) {
//do some logic
}
Запроссамо по себе выглядит так:
public class GetRequest{
private String firstField;
private Long secondField;
private ComplexObject thirdField;
private static class ComplexObject{
private String subFirstField;
private Long subSecondField;
}
}
Поэтому, когда я выполняю запрос с этим объектом из RestTemplate, я хочу получить URI, подобный этому:
/getRoute?firstField=val&secondField=val&thirdField.subFirstField=val&thirdField.subSecondField=val
Как я могу это сделать?Объект может быть абсолютно любым.Более важный вопрос - как перевести такой объект в MultiValueMap для UriComponentsBuilder.
Решение было бы простым, если бы это был запрос POST, но он мне нужен для GET.
Я толькоЗнайте, что библиотека Springfox использует этот подход, когда генерирует Swagger API, но логика внутри слишком сложна.Мой сценарий:
@SuppressWarnings("unchecked")
public <T> ActionResult<T> getAction(String relativeUrl, Class<T> responseType, @Nullable Object paramsObject) {
UriComponentsBuilder builder = createUriComponentsBuilder(relativeUrl, paramsObject);
final ApiErrorCode errorCode;
try {
ResponseEntity<ActionResult> responseEntity = this.restTemplate.getForEntity(builder.build().toUri(), ActionResult.class);
ActionResult responseBody = responseEntity.getBody();
if (!Objects.requireNonNull(responseBody).isSuccess()) {
return responseBody;
}
return ActionResult.ok(this.mapper.convertValue(responseBody.getValue(), responseType));
} catch (RestClientException | HttpMessageNotReadableException e) {
errorCode = ApiErrorCode.API_CONNECTION_ERROR;
} catch (Exception e) {
errorCode = ApiErrorCode.INTERNAL_SERVER_ERROR;
}
return ActionResult.fail(errorCode);
}
private UriComponentsBuilder createUriComponentsBuilder(String relativeUrl, @Nullable Object object) {
String url = this.baseUrl;
if (StringUtils.hasText(relativeUrl)) {
url += relativeUrl;
}
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
if (object != null) {
builder.queryParams(this.convertToMultiValueMap(object));
}
return builder;
}
private MultiValueMap<String, String> convertToMultiValueMap(Object object) {
//todo object to params
}