在 Python 中对捷克贸易许可登记册 (RŽP) 执行 XML-请求
Performing a XML-Request against Czech Trade Licensing Register(RŽP) in Python
我需要创建一个函数,它将发送 xml 和 post 请求并在 python 中接收它。
在 official site 上(仅在捷克语中可用)只有 html 形式的这个小代码:
<form name="frmdata" method="post" enctype="multipart/form-data"
action="http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh">
<input type="hidden" name="VSS_SERV" value="ZVWSBJXML">
<input type="file" name="filename">
<input type="submit" name="x" value="ODESLI">
</form>
所以我试图将它像这样转换为 python,以实现自动化,但它不起作用:
headers = {'Content-Type':'text/xml'}
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
with open('dotaz1.txt') as xml:
myobj = { 'VSS_SERV': 'ZVWSBJXML',
'X': 'ODESLI',
'file': xml,
}
x = requests.post(url, data = myobj, headers=headers)
有人知道我做错了什么吗?
我收到了一个有效的响应,代码如下:
import requests
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
if __name__ == '__main__':
with open('query.xml') as xml:
request_data = {
'VSS_SERV': 'ZVWSBJXML',
'filenameList': xml
}
response = requests.post(url, data=request_data)
print(f"status code: {response.status_code}")
print(f"response:\n{response.text}")
请注意:参数filenameList
与官方API文档不同。但是,使用 filename
的描述值会导致服务器做出非常具体的响应:
Multiple definitions of filename encountered in input.
If you're trying to do this intentionally (such as with select),
the variable must have a "List" suffix.
我相应地更改了请求并得到了有效的 XML 响应。
进一步注意,我 不是 设置显式 HTTP 处理程序,而是让请求模块选择适当的 headers。看起来这很好用——只要你使用 filenameList
。网上有提到这个问题。只需 google 引用错误消息,您就会找到几个结果。似乎通过选择 完全 正确的 HTTP headers 您还可以提供 filename
属性。
我在这个 github 存储库中找到了一些帮助:https://github.com/f4z4onZH27/rzp
我忍不住要引用它的自述文件:
So, here we are, fixing government’s and major vendor’s incompetency.
所以我终于得到了答案。我从这个 post 中得到了一些灵感,其中有一个 C# 的实现:
至于 python,诀窍在于将其作为文件发送,因为它不接受其他格式。此外,我的代码中的 text 变量需要显示格式。你不能从顶部替换文本,否则会出错。
代码:
import requests
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
text = """<?xml version="1.0" encoding="UTF-8"?>
<VerejnyWebDotaz xmlns="urn:cz:isvs:rzp:schemas:VerejnaCast:v1" version="2.8">
<Kriteria>
<IdentifikacniCislo>75848899</IdentifikacniCislo>
<PlatnostZaznamu>0</PlatnostZaznamu>
</Kriteria>
</VerejnyWebDotaz>
"""
if __name__ == '__main__':
with open('query.xml', 'r+') as xml:
xml.truncate(0)
xml.write(text)
xml.seek(0)
request_data = {
'VSS_SERV': 'ZVWSBJXML',
}
response = requests.post(url, data=request_data, files={'filename' : xml})
print(f"status code: {response.status_code}")
print(f"response:\n{response.text}")
要将其用于自动化,您需要做的就是动态更改主题的 ID (IdentifikacniCislo)
我需要创建一个函数,它将发送 xml 和 post 请求并在 python 中接收它。 在 official site 上(仅在捷克语中可用)只有 html 形式的这个小代码:
<form name="frmdata" method="post" enctype="multipart/form-data"
action="http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh">
<input type="hidden" name="VSS_SERV" value="ZVWSBJXML">
<input type="file" name="filename">
<input type="submit" name="x" value="ODESLI">
</form>
所以我试图将它像这样转换为 python,以实现自动化,但它不起作用:
headers = {'Content-Type':'text/xml'}
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
with open('dotaz1.txt') as xml:
myobj = { 'VSS_SERV': 'ZVWSBJXML',
'X': 'ODESLI',
'file': xml,
}
x = requests.post(url, data = myobj, headers=headers)
有人知道我做错了什么吗?
我收到了一个有效的响应,代码如下:
import requests
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
if __name__ == '__main__':
with open('query.xml') as xml:
request_data = {
'VSS_SERV': 'ZVWSBJXML',
'filenameList': xml
}
response = requests.post(url, data=request_data)
print(f"status code: {response.status_code}")
print(f"response:\n{response.text}")
请注意:参数filenameList
与官方API文档不同。但是,使用 filename
的描述值会导致服务器做出非常具体的响应:
Multiple definitions of filename encountered in input. If you're trying to do this intentionally (such as with select), the variable must have a "List" suffix.
我相应地更改了请求并得到了有效的 XML 响应。
进一步注意,我 不是 设置显式 HTTP 处理程序,而是让请求模块选择适当的 headers。看起来这很好用——只要你使用 filenameList
。网上有提到这个问题。只需 google 引用错误消息,您就会找到几个结果。似乎通过选择 完全 正确的 HTTP headers 您还可以提供 filename
属性。
我在这个 github 存储库中找到了一些帮助:https://github.com/f4z4onZH27/rzp
我忍不住要引用它的自述文件:
So, here we are, fixing government’s and major vendor’s incompetency.
所以我终于得到了答案。我从这个 post 中得到了一些灵感,其中有一个 C# 的实现:
至于 python,诀窍在于将其作为文件发送,因为它不接受其他格式。此外,我的代码中的 text 变量需要显示格式。你不能从顶部替换文本,否则会出错。
代码:
import requests
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'
text = """<?xml version="1.0" encoding="UTF-8"?>
<VerejnyWebDotaz xmlns="urn:cz:isvs:rzp:schemas:VerejnaCast:v1" version="2.8">
<Kriteria>
<IdentifikacniCislo>75848899</IdentifikacniCislo>
<PlatnostZaznamu>0</PlatnostZaznamu>
</Kriteria>
</VerejnyWebDotaz>
"""
if __name__ == '__main__':
with open('query.xml', 'r+') as xml:
xml.truncate(0)
xml.write(text)
xml.seek(0)
request_data = {
'VSS_SERV': 'ZVWSBJXML',
}
response = requests.post(url, data=request_data, files={'filename' : xml})
print(f"status code: {response.status_code}")
print(f"response:\n{response.text}")
要将其用于自动化,您需要做的就是动态更改主题的 ID (IdentifikacniCislo)