- PR -

Yahoo!オークションのWebサービス(SOAP版)の利用方法

1
投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-03-09 14:24
お世話になります。

多分すごく簡単なことなのだと思うのですが、どうもうまく出来ないのでアドバイスいただけたらと思います。

Yahoo!オークションのウェブサービス(以下のリンク先)を活用してみたいと思っています。

http://developer.yahoo.co.jp/auctions/

やりたいことは、Yahoo!オークションへの自分の出品リストのモニタです。
これまではRSSをDataSetのReadXmlメソッドで読み込んで処理していたのですが、これをSOAPウェブサービスで置き換えるイメージです。
ちなみにYahoo!オークションのウェブサービスではリンク先にあるようにREST版とSOAP版があって、RESTはRSSと同じくXMLなので特にとまどう点はないのですが、SOAPは初めてやることもあって@ITのAmazonのウェブサービス利用記事などを参考にしながら手探りの状態で進めている状態です。

手順としては、まず以下のWSDLからプロジェクトへのウェブ参照の追加をし

http://soap.auctions.yahoo.co.jp/AuctionWSDL/V1/yahooAuctionService.wsdl

うまく追加できたので以下のコードを記述しました。

jp.co.yahoo.auctions.soap.yahooAuctionService auction = new jp.co.yahoo.auctions.soap.yahooAuctionService();
jp.co.yahoo.auctions.soap.listingParameter param = new jp.co.yahoo.auctions.soap.listingParameter();

//戻り値
int totalAuctions, totalPage, curPage;
jp.co.yahoo.auctions.soap.summary item;

//WEBサービス要求パラメータ
param.sort = "bids"; //入札数でソート
param.order = "a"; //昇順(ASC)

//メソッド呼び出し
totalAuctions = auction.getSellingList("自分のオークションID", param, out totalPage, out curPage, out item);

ここまでは特に問題なさそうで、実際、item.auctionIDなどで値を取り出すことが出来ます。
しかし、itemには複数品目が収められていると思い、二件目のitemにアクセスしようとしたときに、はて?どうすればいいの?という疑問がおきました。配列になっているというわけでもなさそうです。デバッグでitemの値を見てもどうも一件しか格納されていないように見えます。
itemを定義するjp.co.yahoo.auctions.soap.summaryのスキーマを見るとsequenceになっているので複数件名入っていてもおかしくないと思ったのですが、実際のレスポンスデータが見えないこともあってよくわからない状態です。もしかして何か勘違いしているのでは?という気もしてきました。
jp.co.yahoo.auctions.soap.summaryに格納されている値は、複数件名なのでしょうか?そして、どうやって二件目以降のデータにアクセスするのでしょうか?
なお、出品物が複数あることは確認してやっています。

具体的な個別のウェブサービスの話題になってしまい申し訳ありませんが、どこが悪いのかよくわからないためVSの使い方やウェブサービスのデバッグの方法も関係しているかもと思いここで質問させてもらいました。
よろしくお願いします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-03-09 18:52
引用:

実際のレスポンスデータが見えないこともあってよくわからない状態です。



Fiddler か MSSoapT で見ることができます。
http://www.atmarkit.co.jp/fwin2k/win2ktips/479httphview/httphview.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/049mssoapt/mssoapt.html


BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-03-09 23:10
todoさん、どうもありがとうございました。

なるほど、こういうツールがあるのですね。
早速Fiddlerというツールをダウンロードして試してみましたところ、生のSOAPメッセージではきちんと複数の品目を返してきていました。

このAPI最近できたらしくドキュメントが整備されていないので、REST版を参考にしてパラメータなどを入れてみたこともあり、ちゃんと設定できているか不安だったのですが(変数名が違うとか)、とりあえずはYahoo側の問題というわけではなさそうです。

ということは、jp.co.yahoo.auctions.soap.summaryの変数itemの受け渡しのあたりの記述にまずいところがあるのでしょうか?試しにitemを配列として宣言しようとしてもエラーになるし・・
ひとつ心配なのは、これはもしかしてC#の基本的な文法の問題で、実はものすごく恥ずかしい質問をしているのじゃないかということです。どうなんでしょ?
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-03-12 10:12
自動生成されたプロクシクラス(reference.cs)の方が、まずいのでは?
コード:
public int getSellingList(string sellerID, listingParameter param, out int totalPage, out int curPage, out summary item) {
            object[] results = this.Invoke("getSellingList", new object[] {
                        sellerID,
                        param});
            totalPage = ((int)(results[1]));
            curPage = ((int)(results[2]));
            item = ((summary)(results[3]));
            return ((int)(results[0]));
        }



BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-03-12 12:46
todoさん、どうもありがとうございます。

とりあえず、とんでもない質問をしているのではなさそうなので安心しました。
全てが我流で基本ができていないので、変な質問してるんじゃないかといつも不安なんですよね。^_^;

教えていただいたプロキシクラスがプロジェクトに見当たらなかったので調べていたら、これはWindowsアプリの場合に作られるファイルのようですね。
こちらはWebアプリから利用しようとしているのですが、どこかに同じ物があるだろうと探していたらありました!ファイル名は全く違うものですが、システムフォルダー配下のMicrosoft.NETフォルダ内にありました。

で、自動生成されたコードを眺めてみました。Invokeってのがよくわかりませんが、マルチスレッド関連でしょうか?それ関係のメソッドがあと二つ(BeginInvokeとEndInvoke)ありましたが、まあ分からないところはとりあえずすっ飛ばすとして、summaryの実装を見てみると、内部変数をプロパティで読み書きするだけのクラスのようです。内部に配列を持っているわけでもないのでitem自身を配列で宣言しないと複数itemは取り出せないと理解すればよいのでしょうか?
試しに呼び出し側、元でitemをsummary[]で宣言してみましたが、これはさすがにコンパイルエラー。うーんこれ以上追求するのは私の現在の力量では無理そうです。たとえ直せたとしても自動生成されたコードを直すと保守性に問題が出そうですし。

とりあえずはREST版のAPIもあるので、何とかそちらでやってみることとします。REST版だと機能が不足するので工夫が必要ですが・・。

気になるのは、この問題は、WSDLの定義(つまりYahoo側)の問題なのか、VisualStudio側のプロキシクラス生成(Microsoft側)の問題なのかというところです。SOAPについては今回始めてやったのでほとんど知識がないためそのあたりは不明ですが、WSDLの定義の問題だということであればYahooに対して修正依頼もできるのですが。もしそのあたりが分かるようでしたら教えていただけたらと思います。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)