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

Java RestAssured登录成功后调用编辑账号POST接口提示登录失败

问题解决方法

调用edit接口返回login failed是access_token传参不符合接口要求导致的,按以下步骤修复:

  • 修正token传参位置
    你当前代码把access_token直接放在POST请求的JSON体中传递,但几乎所有带鉴权的接口都不会从请求体读取token,通用规范是把token放在HTTP请求头的Authorization字段里,传值格式为Bearer <获取到的access_token>(注意Bearer和token之间有一个半角空格)。
    如果按header传参仍不生效,可以尝试把token作为URL查询参数拼接,即请求地址为/edit?access_token=你的token值,部分早期开发的接口会采用这种鉴权方式。
  • 校验token提取逻辑
    先打印代码中提取到的ACCESS_TOKEN变量值,和登录接口返回的原始响应做比对,确认JsonPath路径写对、没有取到空值,也没有附带多余的空格、换行符。
  • 修正后的核心请求代码参考(header传参版,优先使用):
import java.util.HashMap;
import java.util.Map;

import static io.restassured.RestAssured.*;
import static org.testng.Assert.assertNotEquals;

import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

import org.json.simple.JSONObject;
import org.testng.annotations.Test;

public class EditTest {
    private final String JSON = "application/json";

    @Test
    public void TestCase01() {
        baseURI = "https://auction-app3.herokuapp.com/api";

        // 登录逻辑保持不变
        JSONObject req = new JSONObject();
        req.put("email", "ntv@gmail.com");
        req.put("password", "123456");

        Response res = given()
                .contentType(JSON)
                .body(req.toJSONString())
                .when()
                .post("/login");

        System.out.println("登录响应:" + res.getBody().asString());

        JsonPath jp = res.jsonPath();
        int code = jp.getInt("code");
        String ACCESS_TOKEN = jp.getString("access_token");
        // 先打印提取到的token,确认和返回值一致
        System.out.println("提取到的token:" + ACCESS_TOKEN);

        // 组装编辑接口的请求参数,不需要再把access_token放body里
        JSONObject request = new JSONObject();
        request.put("email", "ninhvinh@gmail.com");
        request.put("password", "123456");
        request.put("re_pass", "123456");
        request.put("address", "MyAddress");
        request.put("name", "MyName");
        request.put("phone", "09090909090");
        request.put("avatar", null);

        Response response = given()
                .contentType(JSON)
                // 核心修改:把token放到Authorization请求头
                .header("Authorization", "Bearer " + ACCESS_TOKEN)
                .body(request.toJSONString())
                .when()
                .post("/edit");

        System.out.println("编辑接口响应:" + response.getBody().asString());

        JsonPath jpath = response.jsonPath();
        assertNotEquals(jpath.getInt("code"), 1000);
    }
}

如果需要走查询参数传token,只需要把编辑接口的请求部分替换为下面的写法即可:

Response response = given()
        .contentType(JSON)
        .queryParam("access_token", ACCESS_TOKEN)
        .body(request.toJSONString())
        .when()
        .post("/edit");

补充说明:如果确认传参位置正确仍报错,检查下两次请求的间隔时间,部分接口的access_token有效期极短,登录后停留太久再调用编辑接口,token过期也会返回登录失败。


内容的提问来源于stack exchange,提问作者Thành Vinh Ninh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:42:24