假设有人开发了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路径键不匹配。”因为那些标签。
根据endpoint的实现方式,返回数据的格式可能取决于客户端发送的Accept
头的值。因此,在使用Postman进行测试和重新启动测试时,请准确检查您发送的标题-它们可能会有所不同,如果您没有在请求中明确指定Accept:application/json
,您的endpoint可能会返回HTML。
你可以做到:
import io.restassured.http.ContentType;
RestAssured.given()
.header("Accept", "application/json")
.when()
.get(endpoint)
.then()
.statusCode(200)
.contentType(ContentType.JSON);
上面的标题提供了标题参数。处理请求后,它将检查状态代码200和内容类型是否为JSON。
从最初的问题到现在已经过去了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]给出一个错误。如何转换?