首页 > 解决方案 > 发送 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

标签: python

解决方案


您的问题是您混淆了requestandputrequest方法。(毫不奇怪,考虑到文档的简洁性和稀疏性……Python 中的大多数模块的文档都比这好得多,所以不要让你担心未来。)

request方法是一种方便的功能,可以一次性添加请求行、所有标头和数据。完成此操作后,添加标题为时已晚,因此出现错误消息。

所以,你可以用任何一种方式修复它。


(1) 改用putrequest. 我意识到文档中没有使用putrequestputheader任何地方的示例,但它看起来像这样:

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如果您不能。它们都更简单,并且有更好的文档记录。


推荐阅读