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
相关产品推荐
相关产品推荐

