2014-05-21

fiddler使ってSOAPとお友達になる。

時代はRESTですがSalesforceはSOAPでメタデータとか弄ったりするんで、

作成したいモノによってはSOAPとお友達にならないといけません。

 

がしかし

「SOAPってHTTPでXMLやりとりして、仕様拡張出来たりするやつっしょ?」

「C#でWebサービス参照して追加すると勝手にクラスとか追加されて簡単に使えるやつだよね?」

程度の理解であるSOAPレベル1のスライムな私としてはお友達になるまでちょっと時間がかかりそうなので

fiddlerというHTTP通信を監視できるストーキングスーパープログラムを使って

SOAPメッセージを見てみることにしましたとさ。

 

今回はSalesforceのMetadataAPIのSOAPメッセージを見てみました。

1. fiddlerのインストール

ここからダウンロードして、インストール。

 

2. C#とか使って提供されているWSDLからスタブクラスを作成

C#の場合は以下のようにしてWebサービス参照を追加してスタブクラスを作成します。

 

2-1. ソリューションエクスプローラーの参照設定を右クリックして[サービス参照の追加]をクリック

CSharp-ref

2-2. 詳細設定をクリック

CSharp-ref2

2-3. [Web参照の追加]をクリック

CSharp-ref3

2-4. URLにWSDLファイルが置いてある場所を指定してWeb参照名を入力後、[参照の追加]をクリック

CSharp-ref4

これでWSDLからのスタブ作成は完了。

 

実際にC#で使う場合はこんな感じ(partner.wsdlもインポート済み)

class Program {
    //カスタムオブジェクトをCRUDで作成するサンプル
    static void Main(string[] args) {
        Partner.SforceService service = new Partner.SforceService();
        Partner.LoginResult lr = service.login("input your name", "input your password");
        service.Url = lr.serverUrl;
        service.SessionHeaderValue = new Partner.SessionHeader();
        service.SessionHeaderValue.sessionId = lr.sessionId;

        Metadata.MetadataService meta_service = new Metadata.MetadataService();
        
        meta_service.Url = lr.metadataServerUrl;
        meta_service.SessionHeaderValue = new Metadata.SessionHeader();
        meta_service.SessionHeaderValue.sessionId = lr.sessionId;

        CustomObject co = new CustomObject();
        co.deploymentStatus = Metadata.DeploymentStatus.Deployed;
        co.deploymentStatusSpecified = true;
        co.description = "このオブジェクトはC#から作ってます";
        co.fullName = "CSH__c";
        co.label = "DotNet Custom Object";
        co.pluralLabel = "DotNet Custom Objects";
        co.sharingModel = Metadata.SharingModel.ReadWrite;
        co.sharingModelSpecified = true;
        co.nameField = new Metadata.CustomField();
        co.nameField.type = Metadata.FieldType.Text;
        co.nameField.label = "The Name";
        co.nameField.length = 100;
        co.nameField.lengthSpecified = true;

        meta_service.create(new Metadata.Metadata[] { co });
    }
}

 

3. スタブクラスのProxyとしてfiddlerのエンドポイントを設定

プログラムからのHTTP通信をトラッキングしたい場合はfiddlerのエンドポイントである

127.0.0.1:8888をプロキシとして利用すればOK。

 

ということで上記プログラムの例だと、MetadataService周りを以下のように変更する。

Metadata.MetadataService meta_service = new Metadata.MetadataService();
//追加↓
meta_service.Proxy = new System.Net.WebProxy("http://127.0.0.1:8888");

meta_service.Url = lr.metadataServerUrl;
meta_service.SessionHeaderValue = new Metadata.SessionHeader();
meta_service.SessionHeaderValue.sessionId = lr.sessionId;

 

ちなみにブラウザからのリクエストに関しては無設定でトラッキングできちゃう。

fiddler立ち上げるとOSのインターネット接続のプロキシが自動的に127.0.0.1:8888に変更されるみたいっす。

 

4. Let's go fiddler

fiddlerを立ち上げて、C#のスタブクラスからSOAP叩いてリクエストとレスポンスをfiddlerで見てみる。

loginはこんな感じ。

[request]

soap-login

[response]

soap-login-response

 

カスタムオブジェクトの作成はこんな感じ。

[request]

soap-createco

[response]

soap-createco-response

 

ということで、SOAPと少しだけお友達になれました。

XMLがわかっちゃえば、あとはパラメータ変えていくだけ良いので

どんな言語だろうがHTTPリクエストが出来ればSOAPなんて簡単です(多分)。

WS-*とか出てきたら各言語のライブラリに任せるしかない…。

 

この方法だとJavaやらC#やらでWSDLからスタブ作ってくれないとどうしようもないので

WSDL解読できないとダメだな~と思いつつ時代はRESTだと思うのであまり気にしていないw

このエントリーをはてなブックマークに追加