让我们说有人开发了以json格式返回数据的rest api,但他没有将响应Content-Type
设置为application/json
,只有text/html
。
现在我已经用REST Assured编写了测试:
given()
.param("username", username)
.param("password", password)
.when()
.get("/authenticate")
.then()
.statusCode(200)
.body("user.id" , hasItem(20));
但它不起作用。我退出了响应机构,这就是我得到的:
<html>
<body>{"key":"752E7A74E8F3999BE9EFE3EA0E0DF320","user":{"id":20,"firstName":"K1","lastName":"K1","role":"ROLE_CUSTOMER","phoneNumber":"888888888"},"expirationDate":"2016-08-10T13:52:50+02:00"}</body>
</html>
和错误:
FAILED: test_login_as_valid_customer("888888888", "3432")
java.lang.AssertionError: 1 expectation failed.
JSON path key doesn't match.
Expected: 20
Actual:
在body标签之间有我想要的json但html标签来自哪里?当我在Postman或Paw中甚至在Web浏览器中测试api方法时,我无法看到它们(因为它是简单的GET和url params)。
我怀疑我收到错误&#34; JSON路径密钥不匹配。&#34;因为那些标签。
答案 0 :(得分:1)
从最初的问题过去了三年,我遇到了同样的问题,这就是我所得到的。
将响应主体包装为html标签是io.restassured.internal.support.Prettifier
类的工作。
您可以通过以下方式禁用它。
RestAssured.requestSpecification.expect()
.log().body(false) // `shouldPrettyPrint` parameter set to false
但这只会影响日志记录,而不会影响实际的响应正文。
关于响应主体的断言认为它是内容类型。如果某些API提供了无效的标头,并且无法在服务器端进行修复,则可以在客户端上解决它。如果使用RestAssured,则可以使用过滤器来完成此操作:
static final Filter FORCE_JSON_RESPONSE_BODY = (reqSpec, respSpec, ctx) -> {
Response response = ctx.next(reqSpec, respSpec);
((RestAssuredResponseOptionsImpl) response).setContentType("application/json");
return response;
};
// globally
RestAssured.filters(FORCE_JSON_RESPONSE_BODY);
// or per request
Response response = RestAssured
.given()
.filters(FORCE_JSON_RESPONSE_BODY)
.get("something")
答案 1 :(得分:0)
您可以这样做:
RestAssured.given()
.header("Accept", "application/json")
.when()
.get(endpoint)
.then()
.statusCode(200)
.contentType(ContentType.JSON);
上面的标头提供了标头参数。处理请求后,它会检查状态码200和内容类型是否为JSON。
答案 2 :(得分:-1)
根据端点的实现方式,返回的数据格式可能取决于客户端发送的Accept
标头的值。因此,在使用Postman进行测试时以及在RESTAssured测试中确切地检查您发送的标题 - 它们可能会有所不同,如果您未在请求中明确指定Accept: application/json
,则您的端点可能会返回HTML。
答案 3 :(得分:-1)
html标签来自Content-Type是text / html,因此json数据被识别为文本并被包装在html的主体中。如果您在浏览器中检查文本,您可能会看到html标记。
答案 4 :(得分:-1)
但html标签来自哪里?
有人手动添加它们,或者在服务器或客户端上编写规则来添加它们。 “Content-type”是标题的一部分。
HTML和BODY是作为文档一部分的标记标记。如果我记得正确,这些在HTML5中是不必要的。
您有两种选择: 1)询问添加这些内容的人将其删除。 (甚至可能是你自己) 2)使用“no-lambda”样式:“response =”,从响应中删除标签并对生成的json进行检查。 前景详见https://github.com/rest-assured/rest-assured/wiki/usage#getting-response-data 你需要添加一个步骤来通过一些字符串操作或html解析器去掉html标签。