我有一个REST WebService和一个PLSQL包,我想从中调用WebService。 调用的参数位于WebService的URI中。
htttp://myservice:8080/some/path/action?value1=123456&value2=some chars&value3=aGermanSonderzeichenCalledÄ
如您所见,URI存在2个问题。首先是value2的空格,然后是value3的特殊字符。
也就是说,我很清楚URI必须编码为更友好的格式。
WebService需要UTF-8,因此URI编码为:
UTL_URL.ESCAPE(url,false,'UTF-8')
。
这导致以下URI:
htttp://myservice:8080/some/path/action?value1=123456&value2=some%20chars&value3=aGermanSonderzeichenCalled%C3%84
到目前为止,这么好。此编码的URI将传递给UTL_HTTP.BEGIN_REQUEST(url,'GET')
。
当我执行此请求并使用Wireshark拦截它时,我可以看到被调用的实际URI是:
htttp://myservice:8080/some/path/action?value1=123456&value2=some%2520chars&value3=aGermanSonderzeichenCalled%25C3%2584
我们可以看到,UTL_HTTP将保留字符'%'转义为%25。 所以在我的情况下,空格首先转换为%20,之后转换为%2520。
我正在寻找的是阻止UTL_HTTP转义保留字符的方法。 作为替代方案,UTL_HTTP在没有调用UTL_URL的情况下处理空白和特殊字符的方式对我来说也很有用。