2012-02-17 8 views
1

私はDelcampe APIに基づいてsoap-clientを書きます。単純なメソッドはうまくいきますが、複雑なデータを必要とする関数は、 "アイテムのデータを送信する必要があります!"というエラーメッセージを表示します。 PHPの例hereに基づいて、データはハッシュまたはハッシュリファレンスのどちらかでなければならないと思っていましたが、どちらも私に以前言及したエラーを与えます。Perl:delcampe APIにどのようなデータを供給すればよいですか?

サンプルスクリプト私が使用します。

use 5.010; 
use SOAP::Lite; 
use SOAP::WSDL; 
use strict; 
use warnings; 
use Data::Dumper; 

my $API_key = 'xyz'; 
my $service = SOAP::Lite->service('http://api.delcampe.net/soap.php?wsdl'); 
my $return = $service->authenticateUser($API_key); 

if ($return->{status}) { 
    my $key = $return->{data}; 
    my %data = (description => 'updated description'); 
    my $response = $service->updateItem($key, 123456, \%data); 

    if ($response->{status}) { 
     say Dumper $response->{data}; 
    } else { 
     say $response->{errorMsg}; 
    } 
} else { 
    say "no: " . $return->{status}; 
} 

ので、データ構造のどのような私が代わりに%dataの使用すべきか、どのように私が要求として生成されるSOAPエンベロープを、デバッグするだろうか?あまりにuse SOAP::Lite qw(trace); igotのSOAPエンベロープを有する(PHP例に基づいてコードが正常に動作し)

ADDITION

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://api.delcampe.net/soap.php"> 
    <soap:Body> 
     <tns:updateItem> 
      <token xsi:type="xsd:string">secret_one</token> 
      <id_item xsi:type="xsd:int">123456</id_item> 
      <arrData xsi:nil="true" xsi:type="soap-enc:Array" /> 
     </tns:updateItem> 
    </soap:Body> 
</soap:Envelope> 

上記から分かるように、送信されるデータのないビットが存在しません。私はstring、array、arrayrefのようなデータも試しました。多分SOAP::Liteのバグでしょうか?

+0

'%data'に' personal_reference'と 'title'キーを含めてみましたか? PHPの例では3つすべてが設定されており、ドキュメントはオプションであるかどうかを明確にしていません。 – cjm

+0

@cjm、私はPHPでも説明だけを変更しようとしましたが、うまくいきました。 –

+1

標準のHTTPデバッグ手法が適用されます。要求/応答のペアを比較するには、Wiresharkを使用します。 – daxim

答えて

1

はあなたが交換するために試してみたかもしれませ

私%のデータ=(説明=> 'の記述を更新します');

私の$データ= SOAP ::データ - >名前(説明=> '更新記述')との

SOAP APIで作業しているときにも同様の問題があり、複雑なデータをSOAP :: Dataにラップすることで解決しました。だから私はこれが助けてくれることを望みます)

UPDATE: ':配列石鹸-ENC' 全くWSDLファイルの定義:

助けにはならなかった以前のアドバイスは、それが実際にSOAP :: Liteのバグ、無視しているように見えます。

最終的に回避策が見つかりました。それはかなりではありませんが、最終的な手段としてはうまくいくかもしれません。私は手動で、DelcampeサイトからWSDLファイルをダウンロードしたローカルディレクトリにそれを保存し、そして

my $service = SOAP::Lite->service('file://...delcampe.wsdl') 

...としてそれに言及しました

まず、...のように絶対パスが必要です。

WSDL updateItem定義内の 'arrData line'をコメントアウトしました。

そして、最後に、私はこれ作った:首尾...

$service->updateItem($key, 123456, $little_monster); 

...によって荒野にそれを解放し、私は告白する、

my $little_monster = SOAP::Data->name(arrData => 
    \SOAP::Data->value((
    SOAP::Data->name(item => 
     \SOAP::Data->value(
      SOAP::Data->name(key => 'personal_reference'), 
      SOAP::Data->name(value => 'Some Personal Reference')->type('string'), 
     ) 
    ), 
    SOAP::Data->name(item => 
     \SOAP::Data->value(
      SOAP::Data->name(key => 'title'), 
      SOAP::Data->name(value => 'Some Amazing Title')->type('string'), 
     ) 
    ), 
    # ... 
)) 
)->type('ns1:Map'); 

...とどの少なくとも、より少なく好都合なエンベロープを生成した。

私はすべてのことをやっているように、壁に頭を打つことから、少なくとも貧しい魂を救うことを心から願っています。)

+0

これはうまくいくはずです - 私はよく同じようにトリップされてしまいました。より複雑なデータ構造の作成と制御の詳細については、SOAP :: Dataのドキュメントを参照してください(http://search.cpan.org/~mkutter/SOAP-Lite -0.714/lib/SOAP/Data.pod) – Ryley

+0

これは有望そうでしたが、同じではありません "アイテムのデータを送信する必要があります! arrDataは空です。 –

+0

あなたの提案と 'SOAP :: Data'ドキュメントに基づいて、私はこの方法でそれを形成しました:http://pastebin.com/XhyZaM4x。うまく行かなかった。率直に言って、私はそれが助けになるとは思わない、メソッド 'updateItem'に与える他の引数は基本的な文字列と基本intですが、リクエストエンベロープをデバッグするとき、それらはXMLとして適切に形成されます。だからなぜ3番目の要素は既にSOAP/XMLとして形成されるべきですか?それはWSDLファイルルールに基づいて私のためにそれらを形成する 'SOAP :: Lite'モジュールの考え方です。 AFAIU –

関連する問題