Python Requests中百分号导致Aspen IP21 REST API查询失败
Python Requests调用Aspen IP21 REST API时LIKE语句%符号失效问题
使用Python requests库通过REST API查询Aspen IP21时,大部分场景都能正常运行,但当SQL查询中包含带%的LIKE语句时,查询就会失效。尝试将%替换为URL编码后的%25,但该API不兼容这种写法。奇怪的是,把代码生成的URL直接复制到浏览器中,却能正常返回结果。
第一次尝试的代码
url = '''https://server.com/ProcessData/AtProcessDataREST.dll/SQL?<SQL ds="host" dso="CHARINT=Y;CHARFLOAT=Y;CHARTIME=Y;CONVERTERRORS=N" t="SQLplus" m="1000000" to="60" s="1"><![CDATA[SELECT name FROM history WHERE name LIKE 'G7%']]></SQL>''' requests.get(url, auth=HTTPKerberosAuth()).json()
返回结果:
{'data': [{'r': 'N'}]}
第二次尝试(手动拼接URL)
怀疑是百分号被自动编码导致问题,于是尝试手动拼接URL:
url = 'https://server.com/ProcessData/AtProcessDataREST.dll/SQL' query = '''?<SQL ds="host" dso="CHARINT=Y;CHARFLOAT=Y;CHARTIME=Y;CONVERTERRORS=N" t="SQLplus" m="1000000" to="60" s="1"><![CDATA[SELECT name FROM history WHERE name LIKE 'G7%']]></SQL>''' s = requests.Session() req = requests.Request('GET', url, auth=HTTPKerberosAuth()) p = req.prepare() p.url += query resp = s.send(p)
返回结果依然是:
{'data': [{'r': 'N'}]}
但此时通过print(p.url)输出的URL,复制到浏览器中可以正常查询到结果。
第三次尝试(替换%为%25)
尝试将SQL语句中的%替换为%25:
url = 'https://server.com/ProcessData/AtProcessDataREST.dll/SQL' query = '''?<SQL ds="host" dso="CHARINT=Y;CHARFLOAT=Y;CHARTIME=Y;CONVERTERRORS=N" t="SQLplus" m="1000000" to="60" s="1"><![CDATA[SELECT name FROM history WHERE name LIKE 'G7%25']]></SQL>''' s = requests.Session() req = requests.Request('GET', url, auth=HTTPKerberosAuth()) p = req.prepare() p.url += query resp = s.send(p)
结果还是返回{'data': [{'r': 'N'}]},而且此时把URL粘贴到浏览器中也无法正常工作。
推测问题根源是Python requests库对%进行了额外编码,导致SQL LIKE语句无法正确匹配目标内容。
内容的提问来源于stack exchange,提问作者Lee G
相关产品推荐
相关产品推荐

