Jak wywołać przeładowaną metodę SOAP z PHP SoapClient?

Zbieg mydła api definiuje dwie metody o tej samej nazwie, ale różnych parametrach:

Page getPage (String token, long pageId) - zwraca pojedynczą stronę (zgodnie z dokumentacją drugim parametrem jest String, ale w WSDL jest długi)Page getPage (String token, String spaceKey, String pageTitle) - zwraca pojedynczą stronę

Musiałbym wywołać metodę z dwoma parametrami używając PHP SoapClient. W trybie WSDL SoapClient nalega na użycie parametru trzech parametrów. W trybie innym niż WSDL udało mi się wywołać dwa parametry, ale nie mogę uczynić typu drugiego parametru długim. Jak mogę uzyskać od SoapClient wywołanie getPage z dwoma parametrami z poprawnymi typami?

Oto co zrobiłem do tej pory:

Używanie SoapClient w trybie WSDL ...

$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);

... generuje żądanie metody trzyparametrowej (pokazany tylko korpus) ...

<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>

... co powoduje błąd:

<faultstring>com.atlassian.confluence.rpc.RemoteException: You're not allowed to view that page, or it does not exist.</faultstring>

Strona z tym identyfikatorem istnieje i mogę go zobaczyć, co mogę potwierdzić, wysyłając poprawny wniosek z SoapUI.

Używanie SoapClient to tryb inny niż 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);

... generuje żądanie dla metody dwuparametrowej z niepoprawnym typem dla drugiego parametru. Gdy $ confluence_article_id jest łańcuchem, żądanie jest ...

<SOAP-ENV:Body><ns1:getPage><param0 xsi:type="xsd:string">8Or94ZLqe7</param0><param1 xsi:type="xsd:string">24445207</param1></ns1:getPage></SOAP-ENV:Body>

... która zwraca ten sam błąd co powyżej:

<faultstring>com.atlassian.confluence.rpc.RemoteException: You're not allowed to view that page, or it does not exist.</faultstring>

Gdy $ confluence_article_id jest liczbą całkowitą, żądanie jest ...

<SOAP-ENV:Body><ns1:getPage><param0 xsi:type="xsd:string">y0kF4z0m9L</param0><param1 xsi:type="xsd:int">24445207</param1></ns1:getPage></SOAP-ENV:Body>

... która zwraca inny rodzaj błędu:

<faultstring>org.xml.sax.SAXException: Bad types (int -> class java.lang.String)</faultstring>

Jeśli wezmę wniosek, zmień int na długo i spróbuj z SoapUI, działa dobrze.

Próbowałem również wywołać go za pomocą __soapCall, ale wyniki są podobne:

$page = $soapClient -> __soapCall('getPage', array('in0'=>$token,'in1'=>$confluence_article_id));

Istnieje pokrewny PHPZgłoszenie błędu iinny, idyskusja na forach Atlassian, ale żaden z nich mi nie pomógł.

Jak dotąd najlepszą sugestią było dostosowanie WSDL poprzez usunięcie innej definicji getPage i zapisanie jej gdzieś lokalnie.

questionAnswers(1)

yourAnswerToTheQuestion