如何请求ID含URL编码'%'的OData资源解决404报错
问题根因
返回404的核心原因是URL多层编码与OData路径解析规则冲突:
- 存储的实体ID字面量为
%252F1.wav,字符串本身包含URL编码保留字符%,其中%25是%的一次编码结果,%2F是/的一次编码结果,该ID实际包含两层编码后的特殊字符。 - 直接拼接
Item('%252F1.wav')发起请求时,OData服务端会自动对路径段内的百分号做一次解码,将%25解析为%,最终实际匹配的ID为%2F1.wav,和存储的真实ID不匹配。同时ID中隐含的斜杠字符如果编码不当,还会被服务端识别为路径分隔符,导致路由错误。
可行解决方案
方案1:正确编码ID后拼接路径(GET/DELETE通用,优先使用)
针对路径段内的特殊字符,需要对原始ID做一次标准URL路径编码:将原始ID中的每个%编码为%25,最终编码后的ID字符串为%25252F1.wav,拼接后的合法请求格式如下:
获取资源:
https://randomOdataService.com/items/Item('%25252F1.wav')
删除资源时直接将请求方法替换为DELETE,请求路径保持一致即可。
方案2:使用$filter查询参数绕过路径解析(适配特殊服务端场景)
如果上述编码后仍然返回404,说明服务端对路径段做了多层强制解码,可以改用查询参数传过滤条件,查询参数的解析逻辑独立于路径段,不会出现自动解码错位问题:
https://randomOdataService.com/items/Item?$filter=ID eq '%252F1.wav'
注意:DELETE方法不支持直接搭配$filter参数执行删除,可先通过上述GET请求拿到实体返回的完整上下文地址,再对该地址发起DELETE请求即可。
内容的提问来源于stack exchange,提问作者cinemandre
相关产品推荐
相关产品推荐

