0

我在 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

我不知道在 PUT 情况下而不是在 POST 情况下类似的 xml 是如何导致解析错误的。欢迎任何建议!谢谢

编辑

更多细节可能会有所帮助......我可以访问服务实现,并且解析如下:

from xml.etree.ElementTree import XML

try:
    node_tree = XML(data.strip())
    return self._parse_xml_node_to_dict(node_tree)
 except ParseError, e:

当我调试时,使用参数调用 XML 构造函数时抛出的异常data.strip()。@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 已经包含截断的数据。但是当我 ste内容中urllib2.Request(url=url, data=xml)的数据xml没有被截断时......

4

2 回答 2

1

如果您有您正在使用的服务的架构,您总是可以尝试自己验证 xml...可能会给您提供更多信息的错误消息..

于 2012-05-05T13:40:17.660 回答
1

显然,正如我在之前的编辑中所说,传输的字符串在到达服务端时会被截断。我无法确定它是与 Django 相关还是与 urllib2 相关。

无论如何,我通过在变量中包含的字符串末尾添加两行新行来解决这个问题xml。一条新线还不够,还有>截断的。

于 2012-05-06T12:41:56.570 回答