RestAssured POST请求传header和body报错解决方法
报错根因
你完全搞反了RestAssured的请求构造流程,用错了操作对象:
header(String key, String value)、body(Object content)是请求构造阶段给RequestSpecification对象用的方法,作用是给待发送的请求配置请求头、请求体- 你代码里拿到的
response是已经发出去的GET请求返回的Response响应对象,这个类里的header(String headerName)是单参数方法,作用是读取指定名称的响应头;无参body()方法作用是读取响应内容,根本不存在你调用的双参header、带参body的方法,参数不匹配自然报错。 - 逻辑顺序也完全错误:你在设置header、body之前就已经调用接口发了GET请求,请求发完之后不可能再给它追加请求参数。
正确修改步骤
- 抽离公共认证逻辑:不要在认证方法里直接写死发GET请求,返回配置好OAuth2认证的
RequestSpecification对象,供GET、POST等不同请求复用 - 在POST方法里先拿到带认证的请求构造对象,依次设置请求头、请求体,最后调用
post()方法传入POST接口地址发起请求 - 请求发送完成后拿到
Response对象,再做响应打印、断言等后续操作
修改后可运行代码
// 抽离公共鉴权请求构造逻辑,供所有需要登录态的接口复用 public static RequestSpecification buildAuthRequest(){ return RestAssured.given() .auth().oauth2(Authentication.login("user","password")); } // 保留原GET请求的Creds方法逻辑 public static Response Creds(String url){ RequestSpecification httpRequest = buildAuthRequest(); Response response = httpRequest.get(url); response.getBody().prettyPrint(); return response; } // 修正后的POST请求方法 public static void CreateActivityPost(){ // 拿到带鉴权的请求构造对象 RequestSpecification httpRequest = buildAuthRequest(); // 构造请求体参数 JSONObject requestParams = new JSONObject(); requestParams.put("userId", "TQ123"); requestParams.put("isbn", "9781449325862"); // 给请求设置头、请求体,发起POST请求,注意替换成实际的POST接口路径 Response response = httpRequest .header("Content-Type", "application/json") .body(requestParams.toJSONString()) .post("www.randomurl.com/your-post-api-path"); // 按需处理响应,比如打印响应内容 response.getBody().prettyPrint(); }
补充说明
RestAssured的标准链式调用流程固定为三段,顺序不能乱:
- 给定请求配置(
given()阶段):设置认证、请求头、请求参数、请求体 - 发起请求(调用请求方法阶段):调用
get()/post()/put()等方法传入接口地址,真正发送请求 - 响应处理(拿到Response阶段):读取响应内容、做接口断言
内容的提问来源于stack exchange,提问作者GetTok
相关产品推荐
相关产品推荐

