Будьте уверены: почему я получаю исключение IllegalStateException? - PullRequest
0 голосов
/ 17 июня 2019

Я нахожусь в процессе изучения структуры Rest-Assured.

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

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

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 был указан в ответе. Тип контента был 'Текст / html; кодировка = UTF-8'

.

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

Спасибо!

1 Ответ

1 голос
/ 17 июня 2019

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


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

Вы можете обойти это и написать filter , чтобы переопределить заголовок 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);
...