请放心:为什么会出现 IllegalStateException 异常?

Rest Assured: Why do I get IllegalStateException exception?

我正在研究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);

我得到以下字符串:

{"country":"US","state":"AK","city":"ADAK"}

作为 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: Cannot parse object because no supported Content-Type was specified in response. Content-Type was 'text/html;charset=UTF-8'.

这是为什么?会不会是其余 returns 和 Html 而不是 Json?我该如何处理?

谢谢!

首先,请记住 REST Assured 是一个 HTTP 客户端,主要用于测试 HTTP APIs。因此,让我强调一下,您不应该将 REST Assured 用于测试以外的任何用途。


您尝试使用的端点似乎在响应负载中返回 JSON 文档,但 Content-Type header 的值为 text/html;charset=UTF-8,因此 REST Assured 无法将响应解析为 JSON 文档并将其转换为 ZipData 的实例。这不是您对健全 HTTP API.

的期望

您可以解决它并编写一个 filter 来覆盖 Content-Type header,如下所示:

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);