使用requests POST发送XML文件

3
我得到:
<error>You have an error in your XML syntax...

当我运行我刚写的 Python 脚本时(我是新手),请看下面的代码:
import requests

xml = """xxx.xml"""

headers = {'Content-Type':'text/xml'}

r = requests.post('https://example.com/serverxml.asp', data=xml)

print (r.content);

这是 xxx.xml 文件的内容。
<xml>
<API>4.0</API>
<action>login</action>
<password>xxxx</password>
<license_number>xxxxx</license_number>
<username>xxx@xyz.com</username>
<training>1</training>
</xml>

我知道这个XML是有效的,因为我在Perl脚本中使用了相同的XML,并且内容被打印回来了。由于我很新手,所以任何帮助都将不胜感激。

1
你实际上没有在读取文件。据我所知,参数“data”需要你的XML文件的实际内容,而不是它的名称。 - UnholySheep
4
找到了文档中的data(可选)- 要发送到请求正文中的字典、字节或类似文件的对象。 因此,您需要将XML文件解析为可附加的内容,或打开该文件并将该对象传递给参数。 - UnholySheep
1个回答

11
您想将文件中的XML数据传递给requests.post。但是,该函数不会为您打开文件。它期望您向其传递一个文件对象,而不是一个文件名。在调用requests.post之前,您需要打开文件。
尝试以下操作:
import requests

# Set the name of the XML file.
xml_file = "xxx.xml"

headers = {'Content-Type':'text/xml'}

# Open the XML file.
with open(xml_file) as xml:
    # Give the object representing the XML file to requests.post.
    r = requests.post('https://example.com/serverxml.asp', data=xml, headers=headers)

print (r.content);

4
据我所见,这里未使用headers。它被定义了但未在POST调用中发送。您可以同时发送两者:requests.post('<address>', headers=headers, data=xml)。我检查了一下,发现不包括它并没有出错,但是我认为如果包括它,结果会更快...无论如何,如果仅仅定义它而不传递它在Python中会做出一些神奇的事情,那也不足为奇。这个答案帮助我进一步理解这个问题。我看到原始问题的提问者也定义了它,但没有使用它。 - Neil Gaetano Lindberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接