Как вызвать перегруженный метод SOAP с помощью PHP SoapClient?


Api soap слияния определяет два метода с одинаковым именем, но разными параметрами:

  • Страница getPage (Строковый токен, длинный идентификатор страницы) - возвращает одну страницу (согласно документации, второй параметр - Строка, но в WSDL он длинный)
  • Страница getPage(Строковый маркер, Строковый пробел, Строковый заголовок страницы) - возвращает одну страницу

Мне нужно было бы вызвать метод с двумя параметрами, используя PHP SoapClient. В режиме WSDL SoapClient настаивает на использовании трехпараметрического. В режиме, отличном от WSDL, мне удалось выполнить вызов с двумя параметрами, но я не могу сделать тип второго параметра длинным. Как я могу заставить SoapClient вызывать getPage с двумя параметрами с правильными типами?

Вот что я сделал до сих пор:

Использование SoapClient в режиме 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);

...создает запрос для метода с тремя параметрами (показано только тело)...

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

Страница с этим идентификатором действительно существует, и мне разрешено ее просматривать, что я могу подтвердить, сделав правильный запрос с помощью 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);

...создает запрос для метода с двумя параметрами с неправильным типом для второго параметра. Когда $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отчет об ошибке и еще один , и обсуждение на форумах Atlassian, но ни один из них мне не помог.

Пока что лучшее предложение состоял в том, чтобы настроить WSDL, удалив другое определение getPage и сохранив его где-нибудь локально.

Author: jarnoan, 2010-01-18

1 answers

Если я правильно помню, вы можете вызвать функцию, используя ассоциативный массив вместо ex:

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

Не проверено, применяются стандартные предупреждения

 0
Author: Kristoffer Sall-Storgaard, 2010-02-03 00:25:13