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

Rest API自动化中查询参数传递数值表达式:mathjs API请求400错误的问题排查与解决

解决RestAssured中请求参数二次URL编码导致的HTTP 400错误

你碰到的问题核心是RestAssured默认会自动对查询参数进行URL编码,而你传入的expr参数值2%2F3已经是编码后的结果(/的URL编码就是%2F),所以RestAssured会把其中的%再次编码为%25,最终得到2%252F3,这就导致服务器无法识别你的表达式,返回了HTTP 400错误。

解决方案一:传入原始表达式,让RestAssured自动编码

最推荐的方式是直接传入未编码的原始表达式,让RestAssured帮你完成正确的编码操作,这样就不会出现二次编码的问题。修改你的代码如下:

import java.util.TreeMap;
import org.junit.Test;
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

public class Mathjs2 {
    @Test
    public void getResponseBody() {
        RestAssured.baseURI = "https://api.mathjs.org/v4/";
        RequestSpecification httpRequest = RestAssured.given().relaxedHTTPSValidation();
        TreeMap<String, String> temp = new TreeMap<String, String>();
        // 传入原始表达式,让RestAssured自动编码
        temp.put("expr", "2/3");
        temp.put("precision", "3");
        httpRequest.queryParams(temp);
        Response response = httpRequest.log().all().get();
        System.out.println(response.getStatusCode());
    }
}

这种方式下,RestAssured会自动把/编码为%2F,生成的请求URL就是你期望的https://api.mathjs.org/v4/?expr=2%2F3&precision=3,服务器能正确解析表达式,返回HTTP 200。

解决方案二:关闭RestAssured的自动URL编码(如果必须传入已编码参数)

如果你因为某些原因必须传入已经编码好的参数值,可以通过关闭RestAssured的自动编码功能来避免二次转义。你可以在请求规格中添加urlEncodingEnabled(false):

import java.util.TreeMap;
import org.junit.Test;
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

public class Mathjs2 {
    @Test
    public void getResponseBody() {
        RestAssured.baseURI = "https://api.mathjs.org/v4/";
        // 关闭自动URL编码
        RequestSpecification httpRequest = RestAssured.given().relaxedHTTPSValidation().urlEncodingEnabled(false);
        TreeMap<String, String> temp = new TreeMap<String, String>();
        temp.put("expr", "2%2F3");
        temp.put("precision", "3");
        httpRequest.queryParams(temp);
        Response response = httpRequest.log().all().get();
        System.out.println(response.getStatusCode());
    }
}

注意:这种方式需要确保所有参数都是已经正确编码的,否则可能会引入其他URL格式错误,所以除非必要,优先使用第一种方案。

为什么Postman能正常工作?

Postman在处理查询参数时,如果你直接输入2%2F3作为参数值,它不会自动再次编码,而是直接将其拼接到URL中,所以生成的URL和你期望的一致,服务器能正确响应。

内容的提问来源于stack exchange,提问作者jitendra gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:17:49