PHP SoapClient ile aşırı SABUN yöntemini çağırmak nasıl?

1 Cevap php

Confluence soap api aynı ada ancak farklı parametrelerle iki yöntemi tanımlar:

  • Sayfa getPage (String belirteci, uzun pageid) - (ikinci parametre String belgelerine göre, ancak WSDL o uzun) bir tek sayfa döndürür
  • Sayfa getPage (String belirteci, String Spacekey, String pageTitle) - Tek bir sayfa döndürür

Ben PHP SoapClient kullanarak iki parametre ile yöntemini çağırmanız gerekir. WSDL modunda SoapClient üç parametre birini kullanarak ısrar ediyor. Non-WSDL modunda iki parametreleri ile bir arama yapmak için başardı, ama ben ikinci parametrenin tipi uzun yapamazsınız. Nasıl SoapClient doğru türleri ile iki parametre ile getPage aramak için alabilirim?

İşte ben bugüne kadar ne yaptık bulunuyor:

WSDL modunda kullanma 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);

... Üç-parametre yöntemi (sadece gövde gösterilir) için bir istek üretir ...

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

... Hangi hataya neden olur:

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

Bu kimliği ile sayfa var yok ve ben SoapUI ile istek doğru tür yaparak teyit edebilir, onu görmek için izin ediyorum.

SoapClient kullanarak non-WSDL modu ...

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

... Ikinci parametresi için yanlış türü ile iki parametre yöntemi için bir istek üretir. $ Confluence_article_id dize olduğunda, istek ...

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

... Ki, yukarıdaki ile aynı hata verir:

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

$ Confluence_article_id tamsayı olduğunda, istek ...

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

... Hangi arıza farklı bir tür verir:

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

Ben uzun isteği, değişim int almak ve SoapUI ile denerseniz, gayet güzel çalışıyor.

Ben de __ soapCall kullanarak aramak için denedim, ama sonuç benzer:

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

Orada ilgili bir PHP bug report ve another one, ve discussion on Atlassian forums, ama bunların hiçbiri bana yardımcı oldu.

Şimdiye kadar en iyi öneri diğer getPage tanımını çıkartarak yere lokal olarak kaydederek WSDL çimdik olmuştur.

1 Cevap

Eğer doğru hatırlıyorum bir ilişkisel dizi yerine eski kullanarak işlevini çağırabilirsiniz:

//Page getPage(String token, String spaceKey, String pageTitle)
$soapClient->getPage(array("token" => $token,"spaceKey" => $spaceKey,"pageTitle" => $pageTitle));

Test değil, standart uyarılar geçerlidir