我正在研究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吗?我该如何处理?
谢谢!
答案 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);