使用Rest Assured进行Rest API测试时参数为空问题求助
排查Rest Assured请求参数为null的问题
我来帮你排查下这个问题,你遇到的情况确实挺头疼——控制台打印的JSON看着没问题,但服务器那边全是null,大概率是序列化或者请求传递环节出了问题,咱们一步步来:
检查
ValidateCard类的序列化基础
你用JSONObject手动序列化Java对象,这个过程依赖类的getter方法和字段命名:- 首先确认
ValidateCard里的每个字段都有对应的getter(比如getCardNo()、getMobileNo()、getcCode()、getProgmType()),如果缺少getter,JSONObject可能无法正确读取字段值。 - 其次检查字段名是否和服务器端期望的完全一致:比如你代码里的
cCode和ProgmType,服务器是不是期望code或者progType?大小写、拼写差一点都会导致服务器无法识别参数。
- 首先确认
替换手动JSON序列化,用Rest Assured自动序列化
Rest Assured本身支持直接传入Java对象并自动序列化为JSON,比手动转JSONObject更可靠,也能避免手动序列化的潜在问题。你可以把代码改成这样:public Response validatecardTest(String cardNo, Object mobileNo, String code, String progType) { ValidateCard validateCard = new ValidateCard(); validateCard.setCardNo(cardNo); validateCard.setMobileNo(mobileNo); validateCard.setcCode(code); validateCard.setProgmType(progType); RequestSpecification requestSpecification = RestAssured.given() .contentType(ContentType.JSON) // 用Rest Assured自带的常量,避免拼写错误 .accept(ContentType.JSON) .body(validateCard); // 直接传入Java对象,Rest Assured会自动序列化 // 加上日志打印,确认实际发送的请求体 requestSpecification.log().all(); Response response = requestSpecification.post("http://ipaddress:port/request url"); System.out.println(response); return response; }如果字段名和服务器期望的不一致,可以给
ValidateCard的字段加上Jackson的@JsonProperty注解来映射,比如:public class ValidateCard { private String cardNo; private Object mobileNo; @JsonProperty("code") // 服务器期望的字段名是code private String cCode; @JsonProperty("progType") // 服务器期望的字段名是progType private String progType; // 对应的getter和setter }确认实际发送的请求体
你之前只打印了自己生成的jsonObject,但实际发送给服务器的内容可能和这个不一样。加上requestSpecification.log().all()后,控制台会打印完整的请求信息,包括请求头、请求体,这样你就能看到真正传到服务器的JSON是什么样的,是不是真的包含了所有参数。检查
mobileNo的类型问题
你把mobileNo定义为Object类型,序列化的时候可能会有特殊处理,比如如果传null的话,JSONObject可能会忽略这个字段,而服务器可能期望这个字段必须存在(哪怕值是null)。如果是这种情况,可以把mobileNo改成具体类型(比如String),或者确保序列化时保留null字段。
内容的提问来源于stack exchange,提问作者Rajesh Om
相关产品推荐
相关产品推荐

