java REST Assured响应体,内容类型:text / html,带有注入的html标签

时间:2016-08-03 12:00:54

标签: java json rest rest-assured

让我们说有人开发了以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;因为那些标签。

5 个答案:

答案 0 :(得分:1)

从最初的问题过去了三年,我遇到了同样的问题,这就是我所得到的。

1-记录问题

将响应主体包装为html标签是io.restassured.internal.support.Prettifier类的工作。 您可以通过以下方式禁用它。

    RestAssured.requestSpecification.expect()
        .log().body(false) // `shouldPrettyPrint` parameter set to false

但这只会影响日志记录,而不会影响实际的响应正文。

2-匹配问题

关于响应主体的断言认为它是内容类型。如果某些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标签。