【问题标题】:Rest Assured: Why do I get IllegalStateException exception?放心:为什么我会得到 IllegalStateException 异常?
【发布时间】:2019-06-17 13:52:32
【问题描述】:

我正在研究 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:无法解析对象,因为没有 在响应中指定了受支持的 Content-Type。内容类型原为 'text/html;charset=UTF-8'。

这是为什么呢?可能是其余的返回 Html 而不是 Json?我该如何处理?

谢谢!

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 还必须添加 jackson-databind 依赖项并且它有效。谢谢!!
    • 没问题!我认为选择它作为答案就足够了...... :)
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多