У меня есть API, который возвращает JSON в таком формате:

[
    { "shrtName": "abc", "validFrom": "2016-10-23", "name": "aaa", "version": 1 },
    { "shrtName": "def", "validFrom": "2016-11-20", "name": "bbb", "version": 1 },
    { "shrtName": "ghi", "validFrom": "2016-11-22", "name": "ccc", "version": 1 }   
]

У меня есть этот код, который читает API и возвращает его как строку. Но я хочу прочитать этот API и сопоставить его с классом Java POJO.

public String downloadAPI(){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.set("API-Key", "4444444-3333-2222-1111-88888888"); 
        HttpEntity<?> requestEntity = new HttpEntity<Object>(headers);
        String URL = "https://aaaaaaa.io/api/v1/aaaaaaaaa?date=2015-04-04;
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
        ResponseEntity<String> response = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, String.class);
        return response.getBody();
}

Мои вопросы:
1) Формат POJO?
2) Изменения в моем методе (возвращаемый тип POJO вместо String)

0
Petr Novák 25 Ноя 2016 в 16:17

2 ответа

Лучший ответ

Ваш JSON - это массив, поэтому []

Создать POJO

public class MyPOJO {
    private String shrtName;
    private Date validFrom;
    private String name;
    private int version;    
}

Удалите конвертер сообщений и рефакторинг метода обмена restTemplate, чтобы

ResponseEntity<MyPOJO[].class> response = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, MyPOJO[].class);

Это общая функция, которую я использую для запросов GET

    public <T> T getRequestAndCheckStatus(final String url, final Class<T> returnTypeClass,
                                          final List<MediaType> mediaTypes,
                                          final Map<String, String> headerParams,
                                          final Map<String, Object> queryParams) throws Exception {

        final HttpHeaders headers = new HttpHeaders();
        headers.setAccept(mediaTypes);
        setHeaderParamsIfExists(headers, headerParams);
        final HttpEntity<String> requestEntity = new HttpEntity<>(headers);

        UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url);
        setQueryParamsIfExists(uriBuilder, queryParams);

        final ResponseEntity<T> entity = restTemplate
                .exchange(getUrl(uriBuilder),
                          HttpMethod.GET,
                          requestEntity,
                          returnTypeClass);

        Assert.assertEquals(HttpStatus.OK, entity.getStatusCode());
        return entity.getBody();
    }

    private void setHeaderParamsIfExists(HttpHeaders headers, Map<String, String> headerParams) {
        if(headerParams != null && !headerParams.isEmpty())
            headerParams.entrySet()
                    .forEach(entry -> headers.set(entry.getKey(), entry.getValue()));
    }

    private void setQueryParamsIfExists(UriComponentsBuilder uriBuilder, Map<String, Object> queryParams) {
        if(queryParams != null && !queryParams.isEmpty())
            queryParams.entrySet()
                    .forEach(entry -> uriBuilder.queryParam(entry.getKey(), entry.getValue()));
    }

    private URI getUrl(UriComponentsBuilder uriBuilder) {
        return uriBuilder.build().encode().toUri();
    }

В вашем случае вы бы назвали это

    getRequestAndCheckStatus("https://aaaaaaa.io/api/v1/aaaaaaaaa", MyPOJO[].class,                    
                             Collections.singletonList(MediaType.APPLICATION_JSON_UTF8), 
                             new HashMap<String, String>(){{ put("API-Key", "4444444-3333-2222-1111-88888888"); }}), 
                             new HashMap<String, Object>(){{ put("Date", "2015-04-04"); }});
  • Кроме того, для Date я рекомендую использовать long, а затем в контроллере проанализировать его до Date. Я вижу, что вы используете протокол https, вы настроили сертификат?
3
Zildyan 27 Ноя 2016 в 13:36

Создайте pojo с этими атрибутами и используйте jackson для преобразования из json String в ваш pojo.

public class MapClass {

private String shrtName;
private Date validFrom;
private String name;
private int version;

}
0
septum 25 Ноя 2016 в 13:44