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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:52:33