2009-04-01 5 views
6

Я пытаюсь получить доступ к WebService с помощью nuSOAP (потому что я связан с PHP4 здесь), который использует более одного пространства имен в сообщении. Это возможно?Как использовать nuSOAP для сообщений с несколькими пространствами имен

Пример запроса сообщение будет выглядеть следующим образом:

<soapenv:Envelope ... 
    xmlns:ns1="http://domain.tld/namespace1" 
    xmlns:ns2="http://domain.tld/namespace2"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ns1:myOperation> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я попытался следующие:

$client = new nusoap_client("my.wsdl", true); 
$params = array(
    'Person' => array(
    'FirstName' => 'Thomas', 
    .. 
    ), 
    'Attribute' => 'foo' 
); 

$result = $client->call('myOperation', $params, '', 'soapAction'); 

в надежде, что NuSOAP будет пытаться соответствовать эти имена правильных имен и узлов. Затем я попытался использовать soapval() для создания элементов и их имен - но если я буду называть операцию, NuSOAP создает следующий запрос:

<SOAP-ENV:Envelope ...> 
    <SOAP-ENV:Body> 
    <queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Так что-то пойдет не так во время фазы «соответствие».

ответ

5

После попытки вокруг с согласования, я нашел два возможных решения:

1) Не используйте WSDL для создания nusoap_client и soapval(), чтобы создать сообщение Это имеет тот недостаток, который содержит сообщение много накладных расходов (пространство имен определено в каждом элементе). Не так хорошо.

2) Вместо того, чтобы полагаться на соответствие параметров, постройте свой ответ в xml и поместите все определение для префиксов в первый элемент - например.

$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="..."> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation>"; 

До сих пор не очень хорошее решение, но оно работает :-)

+0

Я просто попробовал ваше решение, и оно работает ... спасибо человеку. –

0

Да, я был с этой же проблемой (нашел ваш д через Google!), И я пришел через это: http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service-10-min Здесь разработчик создает тело xml сообщения в coe и затем использует nusoap для отправки.

+0

Хмм, кажется, что ссылка в данный момент не работает. Из того, что вы говорите, кажется, что они придерживались аналогичного подхода (создавая xml «вручную»), правильно? – wilth

4

Основываясь на постели Ирвина, я создал xml вручную и оставил nusoap. У моего веб-хостинга нет расширения soap php, поэтому мне пришлось пойти с nusoap, и веб-служба, которую я пытаюсь использовать, требует пространства имен для каждого тега (например, имя пользователя и пароль в моем примере здесь).

require_once('lib/nusoap.php'); 

$client = new nusoap_client('https://service.somesite.com/ClientService.asmx'); 
$client->soap_defencoding = 'utf-8'; 
$client->useHTTPPersistentConnection(); // Uses http 1.1 instead of 1.0 
$soapaction = "https://service.somesite.com/GetFoods"; 

$request_xml = '<?xml version="1.0" encoding="utf-8" ?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Body> 
    <n1:GetFoods xmlns:n1="https://service.somesite.com"> 
     <n1:username>banjer</n1:username> 
     <n1:password>theleftorium</n1:password> 
    </n1:GetFoods> 
    </env:Body> 
</env:Envelope> 
'; 

$response = $client->send($request_xml, $soapaction, ''); 

echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>'; 

Тогда у меня была ошибка, которая сказала:

Notice: Undefined property: nusoap_client::$operation in ./lib/nusoap.php on line 7674 

Так что я пошел ленивый маршрут и пошел в nusoap.php и добавили этот код до строки 7674, чтобы сделать его счастливым:

if(empty($this->operation)) { 
     $this->operation = ""; 
    } 
+0

После очистки Интернета в течение нескольких дней это единственное, что помогло мне понять это. Спасибо! Я не получил эту ошибку, но мне пришлось установить $ client-> endpoint = ''; – Cypher909

1

Другим обходом этой проблемы будет изменение функции nusoap_client :: call(). Рядом с этой линией (7359 в версии 1.123) в nusoap.php:

$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

Я добавил этот один:

$nsPrefix = $this->wsdl->getPrefixFromNamespace("other_ns_name"); 

И это сработало! Поскольку мне нужна была эта библиотека только для одного проекта, мне было здорово жестко подделать этот хак. В противном случае я бы больше копал и модифицировал функцию для принятия массива вместо строки для параметра пространства имен.

 Смежные вопросы

  • Нет связанных вопросов^_^