RestSharp 107.3.0 Query参数URL编码不完整问题求助
RestSharp 107.3.0 URL编码异常问题解决
问题复现
以下是触发问题的核心代码:
var student = new Student() { Code = "123456", Name = "CABEÇA, ANNA", CourseCode = "CRS00199", Enrolled = "2022-07-27 12:25:57" }; var clientOptions = new RestClientOptions() { BaseUrl = new Uri("https://myapi") }; var client = new RestClient(clientOptions); var request = new RestRequest("student/{c}", Method.Put); request.AddUrlSegment("c", student.Code); request.AddQueryParameter("n", student.Name); request.AddQueryParameter("cc", student.CourseCode); request.AddQueryParameter("e", student.Enrolled); var url = client.BuildUri(request); // 实际代码中调用了 url.ToString()
生成的URL存在编码不完整问题:
https://myapi/student/123456?n=CABEÇA%2c ANNA&cc=CRS00199&e=2022-07-27 12%3a25%3a57
预期Ç被编码为%c7,空格也应被编码,但实际未处理。
问题原因
- RestSharp默认编码规则:RestSharp对Query参数默认仅编码部分ASCII特殊字符(如逗号、冒号),非ASCII字符会保留原样,这是因为它默认遵循
application/x-www-form-urlencoded的宽松编码规则,而非严格的URI编码标准。 - Uri.ToString()的行为:即使RestSharp内部做了部分编码,调用
Uri.ToString()时会对已编码的部分做“解码还原”,导致部分编码失效,同时未编码的字符也不会被补充编码。
解决方案
方案1:指定Query参数的编码方式
使用AddQueryParameter的重载,明确指定启用严格URI编码:
// 替换原AddQueryParameter调用,第三个参数设为true启用严格编码 request.AddQueryParameter("n", student.Name, true); request.AddQueryParameter("cc", student.CourseCode, true); request.AddQueryParameter("e", student.Enrolled, true);
当第三个参数为true时,RestSharp会对参数值进行严格的URI编码,覆盖所有非安全字符,包括非ASCII字符和空格。
方案2:使用Uri.AbsoluteUri替代ToString()
Uri.AbsoluteUri会返回完全符合标准的编码URI字符串,避免ToString()的解码问题:
var fullUrl = url.AbsoluteUri;
这个方法能保证所有需要编码的字符都被正确处理,即使RestSharp的默认编码有遗漏。
方案3:手动预编码参数值
如果需要更精细的控制,可以手动对参数值进行URI编码后再添加到请求中:
var encodedName = Uri.EscapeDataString(student.Name); request.AddQueryParameter("n", encodedName);
Uri.EscapeDataString严格遵循RFC 3986标准,会编码所有非安全字符,包括非ASCII字符、空格等。
验证结果
使用上述任一方案后,生成的URL会符合预期:
https://myapi/student/123456?n=CABE%C7A%2C%20ANNA&cc=CRS00199&e=2022-07-27%2012%3A25%3A57
内容的提问来源于stack exchange,提问作者Ryan Ball
相关产品推荐
相关产品推荐

