Python 发送Xml请求

Python 发送Xml请求,python,Python,我在python lol中总共花了30分钟,所以在回答lol时要考虑到这一点: 我正在尝试发送一个带有正文的HTTP POST请求并读取响应。我正在Windows10上使用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,

我在python lol中总共花了30分钟,所以在回答lol时要考虑到这一点:

我正在尝试发送一个带有正文的HTTP POST请求并读取响应。我正在Windows10上使用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")
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中的大多数模块都有比这更好的文档记录,所以不要让这一点担心未来

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更改为使用请求。文档中的所有示例都是这样做的;您只需要建立一个标题的dict来传递给它:

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协议客户端的类。它通常不直接使用-模块使用它来处理使用HTTP和HTTPS的URL

另请参阅,建议使用更高级别的HTTP客户端接口


对于大多数实际情况,如果可以使用第三方库,则希望使用requests,如果不能使用,则希望使用urllib.request。它们都更简单,文档也更完整。

使用http.client有什么原因吗?这是一个相当低级的模块;如果需要坚持使用stdlib,则使用urllib.request通常更简单,如果不坚持使用,则使用第三方模块请求更简单。事实上,这是他们说的第一件事…@abarnert-不知道。。。正如我所说,我有大约5分钟的python经验:。这实际上是为了集成到AppDynamics中,所以我不确定是否有任何限制。那么,您在哪里发现了http.client以及如何使用它?如果您正在扩展一堆其他人的遗留代码,这些代码到处都使用http.client,那么您可能想学习如何使用它,但除此之外,您可能不会。我在使用urllib时得到了它。请求库不起作用,我不想再弄乱它了。lol:。额外的学分::关于一个相关的问题,您建议如何通过xpath从xml响应字符串中读取一两个节点?@SledgeHammer通常是简单xml内容的最佳选择,或者如果您不能使用第三方库的话。两者都没有完全的XPath支持,stdlib支持比lxml更不完整,但它们通常都足以满足您的需要,并且比其他选项更容易入门。@SledgeHammer另一个流行选项是,一个第三方库,它可以在更友好的API中封装lxml,而且它可以一致地用于HTML和XML,并且可以处理各种杂乱的搜索。但是如果您确实知道要运行的XPath查询,那么最好直接使用lxml。我不需要复杂的XPath,只需要简单的东西。。。这只是为了验证响应是否成功。谢谢你的指点!