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をPOSTするには、次のコードを使用します。

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が、POSTの場合ではなく、PUTの場合の解析エラーの原因となる可能性があるのか​​わかりません。どんな提案でも大歓迎です!ありがとう

編集

詳細が役立つ可能性があります...サービスの実装にアクセスしました。解析は次のように行われます。

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コンテンツのデータを盗むとき、切り捨てられません...

4

2 に答える 2

1

使用しているサービスのスキーマがある場合は、いつでも自分で xml の検証を試みることができます...より有益なエラー メッセージが表示される場合があります..

于 2012-05-05T13:40:17.660 に答える
1

どうやら、以前の編集で述べたように、送信された文字列はサービス側に到着すると切り捨てられます。Django関連なのかurllib2関連なのかわかりませんでした。

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

于 2012-05-06T12:41:56.570 に答える