2012-05-05 76 views
0

我與POST進行測試和REST服務PUT方法。XML - 蟒蛇:插入未關閉標籤

基本上我在這兩種情況下使用此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>[email protected]</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)1使用以下代碼:

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()) 

問題:

當我POST數據一切正常。但是,當我試圖使對資源變化,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>[email protected]</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不被截斷數據...

+0

你可能想嘗試的請求包,而不是urllib2的爲你的HTTP PUT,這裏提到:http://stackoverflow.com/questions/111945/is-there-any-way-to-do-http-put -in-python –

+1

你能告訴我們'data'變量的內容嗎? – mzjn

回答

1

因此很明顯,正如我在以前的編輯說,發射的字符串被截斷,當它到達在服務端。 我找不到,如果它是Django的相關或urllib2的相關。

反正我想通了這一點通過包含在xml varibale字符串末尾添加兩個新線。一條新線路還不夠,還有>被截斷。

1

如果你正在使用的服務的模式,你總是可以嘗試自己驗證XML ...可能會給你一個更錯誤提示信息..