You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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内容,就算正确提取响应内容也会触发解析失败。
修复方案
  1. 修正响应内容提取逻辑
    将提取响应字符串的方法从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");
  1. 增加接口调用前置校验
    解析响应前先判断状态码是否符合预期,避免接口异常时解析非JSON内容:
// 需导入Hamcrest匹配器的相关包
assertThat(responseFromApp.getStatusCode(), equalTo(200));

如果调用的是本地HTTPS服务没有合法证书,可在初始化时添加配置忽略证书校验:

RestAssured.useRelaxedHTTPSValidation();
  1. 可选优化:避免手写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 06:54:03