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
相关产品推荐
相关产品推荐

