当前位置: 首页 > 知识库问答 >
问题:

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

唐弘和
2023-03-14

假设有人开发了RESTAPI,以json格式返回数据,但他没有将responseContent-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)。

我怀疑我得到了错误“JSON路径键不匹配。”因为那些标签。

共有3个答案

施晗昱
2023-03-14

根据endpoint的实现方式,返回数据的格式可能取决于客户端发送的Accept头的值。因此,在使用Postman进行测试和重新启动测试时,请准确检查您发送的标题-它们可能会有所不同,如果您没有在请求中明确指定Accept:application/json,您的endpoint可能会返回HTML。

轩辕嘉平
2023-03-14

你可以做到:

import io.restassured.http.ContentType;

RestAssured.given()
     .header("Accept", "application/json")
     .when()
     .get(endpoint)
     .then()
     .statusCode(200)
     .contentType(ContentType.JSON);

上面的标题提供了标题参数。处理请求后,它将检查状态代码200和内容类型是否为JSON。

古起运
2023-03-14

从最初的问题到现在已经过去了3年,我遇到了同样的问题,下面是我得到的。

将响应体包装成html标记是io.restassured.internal.support.美化器类的工作。您可以通过以下方式禁用它。

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

但它只影响日志记录,而不影响实际的响应体。

对其内容类型的响应身心断言。如果某个API提供了无效的头,并且无法在服务器端修复它,那么您可以在客户端解决它。在重新启动的情况下,可以使用过滤器完成:

    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")
 类似资料:
  • 当我尝试向某个endpoint发送sparql查询时,例如: 我明白了 这不是唯一一个我无法向其发送查询的endpoint, 我应该怎么做才能在其他内容类型中获得结果?我试着用谷歌搜索它,但我发现如果我将查询发送到错误的html(不是sparqlendpoint),就会发生这种情况,但是http://data.open.ac.uk/sparql是一个好的endpoint,我通过python向它发送

  • 当调用rest模板获取以下异常时,有人能告诉如何解析html内容吗? restClientException:提取类型[class java.lang.Object]和内容类型[text/html;charset=UTF-8]的响应时出错;嵌套异常为org.springframework.http.converter.httpmessagenotreadableException:JSON分析错误

  • 我在尝试获取gRPC API(使用C#)到blazor客户端时遇到了一个错误,一开始它工作得很好,但是在添加IdentityServer4并使用CORS for gRPC-Web之后,就像在文档中一样。下面是与错误相关的代码。 backend/startup.cs 后端/服务/用户服务.cs 前端/程序.cs 前端/Pages/Todolist.razor.cs 这是控制台的输出 这是尝试使用Id

  • G-WAN4.3.11正在以“text/plain”类型返回我的所有csp文件。这怎么能修好?!目前,它只是一个静态文件服务器。 例如,//127.0.0.1:8080/?hello.py以“Hello,Python! ”(作为text/plain)响应 这应该返回“Hello,Python!”不显示 (以text/html形式)

  • 我有一个API调用,响应200 OK并返回超文本标记语言。我想把这个添加到我的API留档(特别是因为我使用dredd验证它,除非我为它提供预期的响应主体,否则测试会失败)。我在斯威格怎么做? ---更多详细信息---我对API调用的响应是200 OK,带有一行响应体:

  • 当通过Rest Api发布请求时,我抛出 内容类型:应用程序/json 当我尝试编写代码时,我使用以下代码 org.springframework.web.client.RestClientException:无法提取响应:没有找到合适的HttpMessageConverter响应类型[... FileUpload响应DTO]和内容类型[text/html]给出一个错误。如何转换?