Python Requests发送XML POST请求

4
我正在尝试使用uClassify API根据文本对对象进行分类。为了与API交互,我需要进行XML POST请求,例如:
<?xml version="1.0" encoding="utf-8" ?>
<uclassify xmlns="http://api.uclassify.com/1/RequestSchema" version="1.01">
  <writeCalls writeApiKey="YOUR_WRITE_API_KEY_HERE" classifierName="ManOrWoman">
    <create id="CreateManOrWoman"/>
  </writeCalls>
</uclassify>

我尝试使用HTTP请求模块以及xml.etree.ElementTree创建XML树来完成此操作,但是我一直在遇到各种错误。这是我尝试过的一些代码:

>>> import elementtree.ElementTree as ET
>>> from xml.etree.cElementTree import Element, ElementTree
>>> import requests
>>>
>>> root = ET.Element("uclassify", xlms="http://api.uclassify.com/1/RequestSchema", version="1.01")
>>> head = ET.SubElement(root, "writeCalls", writeApiKey="*************", classifierName="test")
>>> action = ET.SubElement(head, "create", id="CreateTest")
>>> tree = ElementTree(root)
>>>
>>> r = requests.post('http://api.uclassify.com/', tree)
>>> 
>>> ........
>>> TypeError: must be convertible to a buffer, not ElementTree

3个回答

5

曾经有一次,我需要做类似的事情,我是这样做的:

requests.post(url, data=xml_string, headers={'Content-Type':'application/xml; charset=UTF-8'})

4

虽然不是 requests 方法,但这里有一个使用我的代码库中的 urllib2 的非常简单的示例:

import urllib2

from elementtree import ElementTree

def post(url, data, contenttype):
    request = urllib2.Request(url, data)
    request.add_header('Content-Type', contenttype)
    response = urllib2.urlopen(request)
    return response.read()

def postxml(url, elem):
    data = ElementTree.tostring(elem, encoding='UTF-8')
    return post(url, data, 'text/xml')

我猜你可能忽略了使用tostring将你命名为rootElementTree Element转换成字符串。

我尝试使用 ElementTree.tostring(tree, encoding='UTF-8') 语句,但出现了错误:AttributeError:类型对象'ElementTree'没有属性'tostring'。随后我尝试使用 xml.etree.ElementTree.tostring(tree, encoding='UTF-8'),但出现了 AttributeError:_ElementInterface实例没有'iter'属性 - bmay2
使用您正在使用的导入库,我认为您需要使用ET.tostring。请确保将其调用在“root”上,而不是“tree”;它适用于元素,而不是树。请参阅http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree.tostring-function - zigg
好的,现在看起来我有一堆UTF-8编码的XML元素。我还需要执行tree = ElementTree(root)吗?因为我刚试着用那个树进行发布,结果得到了另一个TypeError:必须可转换为缓冲区,而不是ElementTree - bmay2
好的,我尝试仅使用 root 元素发布并针对 r.content 收到了此异常:... - bmay2
我不知道你POST到的API需要什么,但是似乎你的链路中某处存在实体转义。tostring不会将<替换为&lt,而你的API似乎声称收到了&lt;?xml...而不是<?xml... - zigg
显示剩余2条评论

1

它正在等待一个字符串XML,尝试像这样做(使用requests):

input_string_xml = ElementTree.tostring(tree, encoding='utf8', method='xml')
param_data = {'xml': input_xml}
output_xml = requests.post("http://api.uclassify.com/", data=param_data)

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