为什么HttpRequestMessage会自动解码我已编码的URL参数字符串
问题原因
这个现象的本质是.NET中Uri类的默认解析逻辑导致的,并非HttpRequestMessage主动对你编码后的字符串做了解码:
- 你把拼接了编码后参数的路径字符串传入
HttpRequestMessage构造函数时,内部会自动将字符串转换为Uri类型对象。Uri类默认会自动将query参数中百分号编码的可打印字符(比如空格对应的%20)做解码处理,因此你在Debug查看RequestUri属性时,看到的就是解码后的Power Tools。
注意事项与解决方案
- 首先明确:这个绝大多数时候只是展示层面的差异,实际使用
HttpClient发送请求时,底层会自动对query参数做标准编码后再传输,并不会直接把未编码的空格发送给服务端,不建议你提前手动对参数做Uri.EscapeDataString编码,容易出现双重编码的问题,直接传入原始参数值让框架自行处理编码即可。 - 如果你需要确认实际请求的编码情况,不要只依赖
RequestUri的Debug展示,建议抓包查看传输的原始请求报文。 - 如果你确实需要完全自定义编码逻辑,避免
Uri自动解码的影响,可以使用UriBuilder构造请求地址,示例如下:
var uriBuilder = new UriBuilder("http://localhost/api/Items/GetAll"); uriBuilder.Query = "category=Power Tools"; var request = new HttpRequestMessage(HttpMethod.Get, uriBuilder.Uri);
内容的提问来源于stack exchange,提问作者Randy
相关产品推荐
相关产品推荐

