发送Xml请求

时间:2018-05-01 22:20:15

标签: python

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

我尝试向正文发送HTTP POST请求并阅读响应。我在Windows 10上使用Python 3.6.5。这是我到目前为止所做的:

导入http.client import 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

1 个答案:

答案 0 :(得分:1)

您的问题是您混淆了requestputrequest方法。 (毫不奇怪,鉴于文档的简洁性和稀疏性...... 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。这就是文档中所有示例的作用;你只需要建立一个标题的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协议的客户端的类。它通常不直接使用 - 模块urllib.request使用它来处理使用HTTP和HTTPS的URL。

     

另请参阅建议将Requests package用于更高级别的HTTP客户端界面。

对于大多数现实情况,如果可以使用第三方库,则需要使用requests;如果不能,则使用urllib.request。它们既简单又有更好的记录。