我在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
答案 0 :(得分:1)
您的问题是您混淆了request
和putrequest
方法。 (毫不奇怪,鉴于文档的简洁性和稀疏性...... 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
。这就是文档中所有示例的作用;你只需要建立一个标题的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
。它们既简单又有更好的记录。