gowsdlはWSDLファイルからgolangのAPIクライアントを自動作成するツールです。Javaでいうところのaxisとか.NETで言うところのWebサービス参照とかそういうやつです。SPMのMetadataAPIをコールするところもgowsdlで自動生成されたAPIクライアントを使っています。

ということで、今回はgowsdlを使ってSalesforceのSOAP APIを叩いてみます。

使い方

ローカルファイルは読み込んでくれないので、Web上に置く必要があります。Salesforceの各種WSDLはWeb上にあるものの、いずれも認証を必要とするので、ダウンロードしたWSDLをS3にPublicなオブジェクトとしてデータをアップロードしたりする必要があります。ただし、Enterprise WSDLはスキーマ情報がそのまま乗るので取扱には注意です。試してませんがローカルにサーバ立てて、そこで配信するのが手軽でセキュアかも。

partner.wsdlでやってみるとこんな感じでエラーが出ます。

gowsdlはシングルバイナリなので、デバッグ仕込んだりすることは出来ませんが、ベースとなっているソースコードを直接いじることで原因を調査することができます。

ということで、ここらへんをコメントアウトして無理矢理動かします(白目)

これでとりあえずクライアントは自動生成できます。自動生成されたパッケージを少し修正して動かしてみます。
まずは、package myservice => package mainに変更します。

同一階層にmain.goを作成する

そのままgo build .すると、こんなエラーが出ます

リクエスト用の構造体とレスポンスの構造体の名前が重複しているのが原因なので、リクエスト用の構造体は***Requestとするように名前を変更します。

またQNameはstringと置き換えても問題なさそうなので、置き換えます。

ここで go buildしてもまだエラーが出ます。

タグ名が一致していない、というエラーです。gowsdlのコメントアウトに起因している可能性もありますが、修正不要なwsdlでやっても同じエラーが出たのでそういう仕様なのかもしれません。とりあえずピンポイントにタグ名を一致させるか、子のタグ名表記を消します。

そうするとgo buildは通りますが、SOAP RequestのFaultが発生します。

SalesforceのSOAP APIはSOAPActionに空文字でも良いので入れる必要があるので無理矢理入れます。

これでログインが通るのですが、SOAPのログ出力がうざいので取ります。

ということでgowsdlの修正と生成されたクライアント側の修正がかなり多いです…。とはいえ、ここまでやってしまえばタグ名の不一致以外のエラーは発生しないので安心してSOAP APIをコールすることができます。

Metadata APIの場合

Metadata WSDLの場合は修正不要でgowsdlが利用できますが、Partner WSDLと違って以下の点を修正する必要があります。

  • リクエスト用のDeploy構造体のZipFileメンバの型名の変更

  • Loginコールが無いので追記する

あとはこんな感じで使えばOK