我在REST服务上使用POST和PUT方法执行测试。
基本上我在这两种情况下使用这个xml:
xml = \
"""<?xml version="1.0" encoding="utf-8" ?>
<quser xmlns="http://user" xmlns:atom="http://www.w3.org/2005/atom">
<username>a_username</username>
<password>blablabla</password>
<first_name></first_name>
<last_name></last_name>
<email>anemail@gogle.com</email>
<degree></degree>
<institution></institution>
<fields>
<role>reader</role>
</fields>
<research_areas></research_areas>
</quser>"""
要发布此xml,我使用以下代码:
def post_resource(url, xml, content_type='application/xml'):
try:
request = urllib2.Request(url=url, data=xml)
request.add_header(key='content-type', val=content_type)
response = opener.open(request)
print_response(response)
except HTTPError, e:
print "Error: %s\n%s" % (e, e.read())
要执行更改(PUT),请使用以下代码:
def put_resource(url, xml, username=None, password=None):
try:
if username and password:
str = "%s:%s" % (username, password)
b64 = str.encode('base64')
request = urllib2.Request(url=url, data=xml)
request.add_header(key='content-type', val='application/xml')
request.add_header(key='Authorization', val='Basic %s' % b64)
request.get_method = lambda: 'PUT'
response = opener.open(request)
print_response(response)
except HTTPError, e:
print "Error: %s\n%s" % (e, e.read())
问题:
当我发布数据时,一切都很顺利。但是当我尝试使用PUT对资源进行更改时,我只发送了相同的xml,只更改了电子邮件地址,并且XML解析器返回:
insert unclosed token: line 14, column 4
我不知道类似的xml如何导致PUT情况下的解析错误,而不是POST情况。欢迎任何建议!感谢
修改
更多细节可以帮助...... 我可以访问服务实现,解析如下:
from xml.etree.ElementTree import XML
try:
node_tree = XML(data.strip())
return self._parse_xml_node_to_dict(node_tree)
except ParseError, e:
当我调试时,使用data.strip()
参数调用XML构造函数时抛出的异常。
@thebjorn:我没有任何xml架构
@mzjn:
谢谢!因此,我要追踪它发生的位置,但data
的内容在某处被截断。以下是内容:
<?xml version="1.0" encoding="utf-8" ?>
<quser xmlns="http://user" xmlns:atom="http://www.w3.org/2005/atom">
<username>victorinox2</username>
<password>42b564oq</password>
<first_name></first_name>
<last_name></last_name>
<email>gosdfsdfsddacyer@gmail.com</email>
<degree></degree>
<institution></institution>
<fields>
<role>reader</role>
</fields>
<research_areas></research_areas>
</quse
我使用Django,似乎request.raw_post_data已包含截断的数据。但是当我在urllib2.Request(url=url, data=xml)
中输入数据时,xml
内容未被截断...
答案 0 :(得分:1)
如果您拥有正在使用的服务的架构,您可以尝试自己验证xml ...可能会为您提供更多信息性错误消息..
答案 1 :(得分:1)
显然,正如我在之前的EDIT中所说的那样,传输的字符串在到达服务端时会被截断。 我无法确定它是否与Django相关或与urllib2相关。
无论如何,我通过在xml
varibale中包含的字符串末尾添加两个新行来解决这个问题。一条新线还不够,仍有>
被截断。