PHP SoapClient でオーバーロードされた SOAP メソッドを呼び出すにはどうすればよいですか?
-
21-09-2019 - |
質問
Confluence 石鹸 API 同じ名前でパラメータが異なる 2 つのメソッドを定義します。
- Page getPage(String token, long pageId) - 単一のページを返します (ドキュメントによると、2 番目のパラメータは String ですが、WSDL では長いです)
- ページ getPage(String token, String spaceKey, String pageTitle) - 単一のページを返します
PHP SoapClient を使用して 2 つのパラメーターを指定してメソッドを呼び出す必要があります。WSDL モードでは、SoapClient は 3 つのパラメーターを使用することを要求します。非 WSDL モードでは、2 つのパラメータを指定して呼び出しを行うことができましたが、2 番目のパラメータの型をlongにすることができません。SoapClient が正しい型の 2 つのパラメーターを指定して getPage を呼び出せるようにするにはどうすればよいですか?
これまでに私がやったことは次のとおりです。
WSDL モードで SoapClient を使用しています...
$soapClient = new SoapClient("http://xxx/confluence/rpc/soap-axis/confluenceservice-v1?wsdl", array("trace" => TRUE));
$token = $soapClient->login(CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD);
$page = $soapClient->getPage($token, $confluence_article_id);
...3 つのパラメーターのメソッドのリクエストを生成します (本文のみが表示されます)...
<SOAP-ENV:Body><ns1:getPage><in0 xsi:type="xsd:string">dkjLIx00Ap</in0><in1 xsi:type="xsd:string">24445207</in1><in2 xsi:nil="true"/></ns1:getPage></SOAP-ENV:Body>
...これにより障害が発生します:
<faultstring>com.atlassian.confluence.rpc.RemoteException: You're not allowed to view that page, or it does not exist.</faultstring>
その ID を持つページは存在しており、閲覧が許可されています。これは、SoapUI で正しい種類のリクエストを行うことで確認できます。
SoapClient の使用は非 WSDL モードです...
$soapClient = new SoapClient(null, array(
"location" => "http://xxx/confluence/rpc/soap-axis/confluenceservice-v1",
"uri" => "http://soap.rpc.confluence.atlassian.com",
"trace" => TRUE));
$token = $soapClient->login(CONFLUENCE_USERNAME, CONFLUENCE_PASSWORD);
$page = $soapClient->getPage($token, $confluence_article_id);
...2 番目のパラメーターの型が正しくない、2 パラメーターのメソッドに対するリクエストが生成されます。$confluence_article_id が文字列の場合、リクエストは...
<SOAP-ENV:Body><ns1:getPage><param0 xsi:type="xsd:string">8Or94ZLqe7</param0><param1 xsi:type="xsd:string">24445207</param1></ns1:getPage></SOAP-ENV:Body>
...上記と同じエラーを返します。
<faultstring>com.atlassian.confluence.rpc.RemoteException: You're not allowed to view that page, or it does not exist.</faultstring>
$confluence_article_id が整数の場合、リクエストは...
<SOAP-ENV:Body><ns1:getPage><param0 xsi:type="xsd:string">y0kF4z0m9L</param0><param1 xsi:type="xsd:int">24445207</param1></ns1:getPage></SOAP-ENV:Body>
...これは別の種類の障害を返します。
<faultstring>org.xml.sax.SAXException: Bad types (int -> class java.lang.String)</faultstring>
リクエストを受け取り、int を long に変更して SoapUI で試してみると、問題なく動作します。
__soapCall を使用して呼び出してみましたが、結果は同様でした。
$page = $soapClient -> __soapCall('getPage', array('in0'=>$token,'in1'=>$confluence_article_id));
関連するPHPがあります バグレポート そして もう一つ, 、 そして アトラシアン フォーラムでのディスカッション, 、しかし、どれも私を助けてくれませんでした。
これまでのところ、他の getPage 定義を削除し、それをローカルのどこかに保存することで WSDL を微調整することが最善の提案です。
解決
私の記憶が正しければ、あなたが代わりに元連想配列を使用して関数を呼び出すことができます:
//Page getPage(String token, String spaceKey, String pageTitle)
$soapClient->getPage(array("token" => $token,"spaceKey" => $spaceKey,"pageTitle" => $pageTitle));
未テスト、標準の警告が適用されます。