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

时间:2019-06-17 13:52:32

标签: rest rest-assured rest-assured-jsonpath

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

我得到以下字符串:

  

{“国家”:“美国”,“州”:“ AK”,“城市”:“ 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:无法解析对象,因为没有   在响应中指定了受支持的Content-Type。原“内容类型”为   'text / html; charset = UTF-8'。

那是为什么?可能是其余的返回HTML而不是Json吗?我该如何处理?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,请记住,REST Assured是主要用于测试HTTP API的HTTP客户端。因此,让我强调一下,除了测试之外,您不应该使用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);