python - 发送 Xml 请求
问题描述
我在 python lol 上总共花了 30 分钟,所以在你回答 lol 时要考虑到这一点:
我正在尝试发送带有正文的 HTTP POST 请求并读取响应。我在 Windows 10 上使用 Python 3.6.5。这是我目前所拥有的:
导入 http.client 导入 xml.dom.minidom
HOST = "www.mysite.com"
API_URL = "/service"
def do_request(xml_location):
request = open(xml_location, "r").read()
webservice = http.client.HTTPConnection(HOST)
webservice.request("POST", API_URL)
webservice.putheader("Host", HOST)
webservice.putheader("User-Agent", "Python Post")
webservice.putheader("Content-type", "text/xml; charset=\"UTF-8\"")
webservice.putheader("Content-length", "%d" % len(request))
webservice.endheaders()
webservice.send(request)
statuscode, statusmessage, header = webservice.getreply()
result = webservice.getfile().read()
resultxml = xml.dom.minidom.parseString(result)
print (statuscode, statusmessage, header)
print (resultxml.toprettyxml())
with open("output-%s" % xml_location, "w") as xmlfile:
xmlfile.write(resultxml.toprettyxml())
do_request("test.xml")
test.xml 包含 XML 请求。当我运行时,我得到一个错误:
Traceback (most recent call last):
File "C:\Users\xxx\Documents\test.py", line 33, in <module>
do_request("test.xml")
File "C:\Users\xxx\Documents\test.py", line 14, in do_request
webservice.putheader("Host", HOST)
File "C:\Users\xxx\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1201, in putheader
raise CannotSendHeader()
http.client.CannotSendHeader
解决方案
您的问题是您混淆了request
andputrequest
方法。(毫不奇怪,考虑到文档的简洁性和稀疏性……Python 中的大多数模块的文档都比这好得多,所以不要让你担心未来。)
该request
方法是一种方便的功能,可以一次性添加请求行、所有标头和数据。完成此操作后,添加标题为时已晚,因此出现错误消息。
所以,你可以用任何一种方式修复它。
(1) 改用putrequest
. 我意识到文档中没有使用putrequest
或putheader
任何地方的示例,但它看起来像这样:
webservice.putrequest("POST", API_URL)
webservice.putheader("Host", HOST)
webservice.putheader("User-Agent", "Python Post")
webservice.putheader("Content-type", "text/xml; charset=\"UTF-8\"")
webservice.putheader("Content-length", "%d" % len(request))
webservice.endheaders()
webservice.send(request)
(2) 改用request
. 这就是文档中所有示例的作用;你只需要建立一个标题的字典来传递给它:
headers = {
"Host": HOST,
"User-Agent": "Python Post",
"Content-type", "text/xml; charset=\"UTF-8\"",
"Content-length", "%d" % len(request)
}
webservice.request("POST", API_URL, headers=headers, body=request)
(3) 在文档顶部阅读此内容:
该模块定义了实现 HTTP 和 HTTPS 协议客户端的类。它通常不直接使用——模块urllib.request使用它来处理使用 HTTP 和 HTTPS 的 URL。
另见Requests 包被推荐用于更高级别的 HTTP 客户端接口。
requests
对于大多数现实生活中的案例,如果您可以使用第三方库,您想使用,urllib.request
如果您不能。它们都更简单,并且有更好的文档记录。
推荐阅读
- android - 必应地图图钉点击事件
- c# - 将 for 循环存储到数组中
- python-3.x - 如果 mySQL 数据库中已经存在用户名和密码,我如何在 python 中进行验证?
- php - Yii2 优化长时间运行的查询以降低超时
- codenameone - 不允许使用明文交通
- python - 如何使用 pyspark 和 shc(spark hbase 连接器)而不是整个数据集从 hbase 读取一个表的部分数据?
- javascript - 使用“expr:href”打开新标签之前的确认框
- typescript - 如何使用单信号休息 api 从我的离子应用程序触发单信号通知。我已经通过了文档,但没有得到它
- python - 如何将 + 替换为 . (句号)使用python替换
- javascript - 如果用户点击第二个下拉链接,则关闭下拉菜单