如何使用REST Assured发送含格式错误URL参数或路径的请求?
解决REST Assured发送含未编码百分号(%)请求的问题
我之前也碰到过一模一样的问题——REST Assured底层依赖Java的URI类做合法性检查,而URI严格遵循RFC规范,不允许单独出现未编码的%(因为%是转义序列的起始符,必须后跟两位十六进制数),所以哪怕你关掉了urlEncodingEnabled,请求还没发出去就会触发URISyntaxException。
要绕过这个限制,最直接的方法是跳过REST Assured的默认URI构建逻辑,直接使用Apache HttpClient的底层请求对象来构造请求,因为HttpClient允许发送这种不符合严格URI规范的请求(毕竟我们就是要测试服务对非法请求的响应)。
具体实现代码
import org.apache.http.client.methods.HttpGet; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; public class InvalidRequestTest { @org.junit.jupiter.api.Test void testUnencodedPercentSignRequest() { // 直接构造HttpGet请求,传入包含未编码%的完整URL字符串 HttpGet invalidRequest = new HttpGet("http://example.com/some/path?thisiswrong=%"); given() .request(invalidRequest) // 让REST Assured使用这个自定义请求 .then() .statusCode(400) // 替换成你预期的错误状态码 .body("errorMessage", equalTo("Invalid parameter format")); // 替换成你预期的错误信息 } }
为什么这个方法有效?
REST Assured默认的请求流程会先把你传入的baseUri、basePath、参数等拼接成URI对象,这一步就会触发Java的严格语法检查。而直接使用Apache HttpClient的HttpGet对象时,它会直接把你传入的字符串作为请求的目标路径发送,不会提前做URI语法验证,完美绕过了REST Assured内部的检查逻辑。
补充说明
虽然这种请求不符合标准的URL规范,但既然我们的测试目标就是验证服务对非法请求的处理,这种方法完全符合需求。你之前尝试的get(new URI(...))或者get(new URL(...))之所以失败,是因为URI和URL类本身都会做严格的语法检查,和REST Assured的设置无关。
内容的提问来源于stack exchange,提问作者leugim
相关产品推荐
相关产品推荐

