使用Rest Assured获取token时报Failed to parse the JSON document如何解决
报错核心原因
- 最直接的错误是响应体提取方式错误:代码中
responseFromApp.getBody().toString()调用的是Object基类的toString方法,返回的是ResponseBody对象的内存地址标识(格式类似io.restassured.internal.RestAssuredResponseImpl@xxx),并非接口实际返回的JSON字符串,JsonPath解析非JSON格式的内容时就会抛出该报错。 - 次要可能原因:接口调用失败(比如本地HTTPS证书校验不通过、参数错误、路径错误等),返回的是HTML错误页、纯文本错误提示等非JSON内容,就算正确提取响应内容也会触发解析失败。
修复方案
- 修正响应内容提取逻辑
将提取响应字符串的方法从toString()替换为Rest Assured提供的asString()方法,或者直接从Response对象中获取JsonPath,无需单独转字符串:
// 方案1:修正字符串提取方法 String jsonString = responseFromApp.getBody().asString(); String tokenGenerated = JsonPath.from(jsonString).get("access_token"); // 方案2:更简洁的写法,直接调用响应对象的jsonPath方法 String tokenGenerated = responseFromApp.jsonPath().get("access_token");
- 增加接口调用前置校验
解析响应前先判断状态码是否符合预期,避免接口异常时解析非JSON内容:
// 需导入Hamcrest匹配器的相关包 assertThat(responseFromApp.getStatusCode(), equalTo(200));
如果调用的是本地HTTPS服务没有合法证书,可在初始化时添加配置忽略证书校验:
RestAssured.useRelaxedHTTPSValidation();
- 可选优化:避免手写JSON请求体
手动拼接JSON字符串容易出现转义错误、格式错误,可改用Map构造请求体,Rest Assured会自动序列化为JSON格式:
Map<String, Object> payload = new HashMap<>(); payload.put("client_id", "ahsan@gmail.com"); payload.put("client_secret", "1212"); payload.put("isInternalUser", true); payload.put("grant_type", "client_credentials"); request.body(payload);
修复后完整参考代码
import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import java.util.HashMap; import java.util.Map; import static org.hamcrest.Matchers.equalTo; public void appToken() { // 忽略本地HTTPS证书校验 RestAssured.useRelaxedHTTPSValidation(); RestAssured.baseURI = "https://localhost"; Map<String, Object> payload = new HashMap<>(); payload.put("client_id", "ahsan@gmail.com"); payload.put("client_secret", "1212"); payload.put("isInternalUser", true); payload.put("grant_type", "client_credentials"); Response responseFromApp = RestAssured.given() .contentType(ContentType.JSON) .body(payload) .when() .post("/auth/oauth/oidc/login-token") .then() .statusCode(equalTo(200)) .extract() .response(); String tokenGenerated = responseFromApp.jsonPath().get("access_token"); System.out.println("获取到的鉴权Token:" + tokenGenerated); }
内容的提问来源于stack exchange,提问作者Ihsan Rehman
相关产品推荐
相关产品推荐

