2012-05-05 11 views
0

私はRESTサービスでPOSTとPUTメソッドを使ってテストを行っています。XML - python:非公開タグを挿入してください

基本的に、私は両方のケースで、この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)を行うことを私はこのコードを使用:

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の場合には発生しません。どんな提案も歓迎です!

詳細を助けることができるおかげで

EDIT ... 私はサービス実装へのアクセスをした、と解析は次のように構成されます。

私はデバッグ
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>[email protected]</email> 
<degree></degree> 
<institution></institution> 
<fields> 
    <role>reader</role> 
</fields> 
<research_areas></research_areas> 
</quse 

私はジャンゴを使用して、request.raw_post_dataが既に切り捨てられたデータが含まれているようです。しかし、私はxmlコンテンツが切り捨てられないurllib2.Request(url=url, data=xml)でデータを... STEとき

+0

HTTP PUTのurllib2の代わりにRequestsパッケージを試してみるとよいでしょう。http://stackoverflow.com/questions/111945/is-there-any-way-to-do-http-put -in-python –

+1

'data'変数の内容を表示できますか? – mzjn

答えて

1

これまでの私のEDITで述べたように、送信された文字列はサービス側に到着すると切り捨てられます。 Django関連のものかurllib2関連のものかはわかりませんでした。

とにかく、私はxml varibaleに含まれる文字列の最後に2行の新しい行を追加することでこれを理解しました。 1つの新しい行がまだ十分ではなく、>が切り捨てられていました。

1

あなたが使用しているサービスのスキーマを持っている場合、あなたはいつも...自分でXMLを検証しようとすることができますより多くを与えるかもしれません参考情報エラーメッセージ..

関連する問題