Будьте уверены: почему я получаю исключение IllegalStateException?

Я изучаю фреймворк Rest-Assured.

Я использую бесплатный API http://ziptasticapi.com для своих упражнений.

Когда я звоню:

final static String BASE_URI = "http://ziptasticapi.com/";

final static String ADAK_ZIP_CODE = "99546"; //{"country":"US","state":"AK","city":"ADAK"}
final static String ATKA_ZIP_CODE = "99547";

public static final String GET_METHOD = "GET";
    RestAssured.baseURI = BASE_URI;

    String responseString = when().get(ADAK_ZIP_CODE).then()
            .statusCode(200)
            .and()
            .extract()
            .asString();

    System.out.println(responseString);

Получаю такую ​​строку:

{"страна": "США", "штат": "АК", "город": "АДАК"}

как значение responseString.

Когда я пытаюсь:

 RestAssured.baseURI = BASE_URI;      

 ZipData zipdata = when().get(ADAK_ZIP_CODE).then()
            .statusCode(200)
            .and()
            .extract()
            .as(ZipData.class);

public class ZipData {

    public String country;
    public String state;
    public String city;

}

Я разбиваюсь на:

java.lang.IllegalStateException: невозможно проанализировать объект, поскольку в ответе не был указан поддерживаемый Content-Type. Content-Type был 'text / html; charset = UTF-8'.

Это почему? Может быть, все остальное возвращает Html, а не Json? Как мне с этим справиться?

Спасибо!


person dushkin    schedule 17.06.2019    source источник


Ответы (1)


Прежде всего, имейте в виду, что REST Assured - это HTTP-клиент, в первую очередь разработанный для тестирования HTTP API. Поэтому позвольте мне подчеркнуть, что вам не следует использовать REST Assured для чего-либо, кроме тестирования.


Похоже, что конечная точка, которую вы пытаетесь использовать, возвращает документ JSON в полезной нагрузке ответа, но значение заголовка Content-Type равно text/html;charset=UTF-8, поэтому REST Assured не может проанализировать ответ как документ JSON и преобразовать его в экземпляр ZipData. Это не то, что вы ожидаете от надежного HTTP API.

Вы можете обойти это и написать фильтр, чтобы переопределить Content-Type заголовок, как показано ниже:

public class OverrideContentTypeFilter implements Filter {

    @Override
    public Response filter(FilterableRequestSpecification requestSpec,
                           FilterableResponseSpecification responseSpec,
                           FilterContext ctx) {

        Response next = ctx.next(requestSpec, responseSpec);
        return new ResponseBuilder().clone(next).setContentType(ContentType.JSON).build();
    }
}

Затем используйте его следующим образом:

ZipData zipdata =
        given()
            .filter(new OverrideContentTypeFilter())
        .when()
            .get(uri)
        .then()
            .statusCode(200)
            .extract()
            .as(ZipData.class);
person cassiomolin    schedule 17.06.2019
comment
Также пришлось добавить зависимость jackson-databind, и это сработало. Спасибо!! - person dushkin; 18.06.2019
comment
Без проблем! Я думал, что достаточно выбрать его в качестве ответа ... :) - person dushkin; 18.06.2019