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

DeletePlace请求200成功但无响应体,Utils类第47行报错求助

问题分析与解决方案

问题详情

验证DeletePlace请求的响应体"status": "OK"时触发异常:

  • 请求返回200状态码,但日志文件中无响应体内容
  • 控制台报错定位到Utils类第47行(return js.get(key).toString();)

相关代码

package resources;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Properties;

import io.restassured.RestAssured;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.filter.log.RequestLoggingFilter;
import io.restassured.filter.log.ResponseLoggingFilter;
import io.restassured.http.ContentType;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

public class Utils {
    
    public static RequestSpecification req;
    public RequestSpecification requestSpecification() throws IOException
    {
        if (req==null)
        {
        PrintStream log = new PrintStream(new FileOutputStream("logging.txt"));
        req = new RequestSpecBuilder().setBaseUri(getGlobalValue("baseUrl")).addQueryParam("key", "qaclick123")
                .addFilter(RequestLoggingFilter.logRequestTo(log))
                .addFilter(ResponseLoggingFilter.logResponseTo(log))
        .setContentType(ContentType.JSON).build();
        return req;
        }
        return req;
    }
    
    public static String getGlobalValue(String key) throws IOException
    {
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("E:\\Eclipse-Workspace\\RestAssuredAPIFramework\\src\\test\\java\\resources\\global.properties");
        prop.load(fis);
        return prop.getProperty(key);
    }
    
    public String getJsonPath(Response response, String key)
    {
        String resp = response.asString();
        JsonPath js = new JsonPath(resp);
        return js.get(key).toString(); //Error line
    }

}

核心原因

  1. 响应体为空:部分Delete接口在执行成功(返回200)时不会返回任何响应体,此时response.asString()会得到空字符串,JsonPath解析空内容时无法找到"status"字段,返回null后调用toString()触发空指针异常。
  2. 日志未记录空响应体:ResponseLoggingFilter默认可能不记录空响应体,导致日志文件中无相关内容。

解决方案

1. 修复getJsonPath方法,处理空响应体与null值

修改Utils类的getJsonPath方法,增加空值判断,避免空指针:

public String getJsonPath(Response response, String key) {
    String resp = response.asString();
    // 先判断响应体是否为空或空白字符
    if (resp == null || resp.trim().isEmpty()) {
        return null; // 或返回空字符串,根据测试需求调整
    }
    JsonPath js = new JsonPath(resp);
    Object value = js.get(key);
    // 处理字段不存在导致的null值
    return value != null ? value.toString() : null;
}

2. 调整测试逻辑,适配空响应体场景

在测试代码中,先判断响应体是否存在,再选择验证方式:

// 执行DeletePlace请求
Response deleteResponse = given().spec(utils.requestSpecification())
        .body(deletePayload)
        .when().delete("/maps/api/place/delete/json")
        .then().extract().response();

// 优先验证状态码,再根据响应体是否存在验证status字段
Assert.assertEquals(deleteResponse.getStatusCode(), 200);
String responseBody = deleteResponse.getBody().asString().trim();
if (!responseBody.isEmpty()) {
    String status = utils.getJsonPath(deleteResponse, "status");
    Assert.assertEquals(status, "OK");
}

3. 确保空响应体被日志记录

修改日志输出逻辑,强制记录空响应体:

// 在requestSpecification方法中,自定义响应日志过滤器,确保空响应体被记录
ResponseLoggingFilter customResponseFilter = ResponseLoggingFilter.responseLogger()
        .logStatusCode()
        .logStatusLine()
        .logHeaders()
        .logBody(LogDetail.ALL);

req = new RequestSpecBuilder().setBaseUri(getGlobalValue("baseUrl")).addQueryParam("key", "qaclick123")
        .addFilter(RequestLoggingFilter.logRequestTo(log))
        .addFilter(customResponseFilter)
        .setContentType(ContentType.JSON).build();

内容的提问来源于stack exchange,提问作者deepak thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:05:22