Android Studio Volley请求ORDS服务返回555错误的参数编码问题
问题根因
你碰到的HTTP 555是Oracle ORDS抛出的参数解析类错误,核心触发原因是查询参数未做合规的URL编码。=和;都是URL规范定义的保留字符:=的默认作用是分隔查询参数的键和值,;在早期HTTP规范中被定义为参数间的分隔符。当你直接在URL中传入未编码的p_p4=BAN_NUM=1;BAN_COD=null;SCARTI=0;时,ORDS会把p_p4值内部的=、;识别为参数分隔符,把原本属于p_p4的内容拆成多个无效的零散参数,导致绑定失败返回555。
Postman调用能正常返回,是因为Postman在发请求前会自动对URL中的特殊字符做隐式编码,不需要你手动处理。你服务端代码里写的两层REPLACE逻辑完全无效:ORDS在把请求参数绑定到PL/SQL的:p_p4绑定变量前,就已经完成了URL解码,你在PL/SQL里拿到的p_p4根本不会包含%3D、%3B这类编码后的字符串,这层替换永远不会触发。
正确处理方案
- 客户端侧严格执行URL百分号编码
所有查询参数的值在拼接到URL前,必须通过编程语言原生的URL编码方法做转义,禁止手动拼接未编码的特殊字符。你当前p_p4参数值BAN_NUM=1;BAN_COD=null;SCARTI=0;编码后的正确结果是BAN_NUM%3D1%3BBAN_COD%3Dnull%3BSCARTI%3D0%3B,拼接完成的合法查询串如下:
不要自己写正则或者字符串替换做编码,原生编码方法会覆盖所有需要转义的保留字符,避免漏转其他特殊字符触发同类问题。p_cmd=14&p_p1=4&p_p2=1000048819&p_p3=03394100140105&p_p4=BAN_NUM%3D1%3BBAN_COD%3Dnull%3BSCARTI%3D0%3B - 服务端删除冗余的替换逻辑
直接把解码后的p_p4参数传给存储过程即可,也就是把存储过程调用改回apex_303.pro_conferma_dati(p1,to_number(p2),to_number(p3),p4,outrc,outms);,删掉REPLACE(REPLACE(...))的逻辑,保留这层代码反而会在参数值真的包含%3D、%3B字符串时造成数据错误。 - 复杂参数场景改用POST请求
如果后续参数包含更多特殊字符、或者参数长度超过URL长度限制,建议把接口改为POST方法,将参数放在请求体中传递(支持form表单或JSON格式),ORDS绑定请求体参数时不会受URL保留字符规则限制,稳定性远高于GET传参。
内容的提问来源于stack exchange,提问作者Scripta14
相关产品推荐
相关产品推荐

