Получение данных из веб-сервиса WSDL на PHP - PullRequest
4 голосов
/ 21 июля 2011

Я начну с того, что понятия не имею, что вообще происходит с тем, что я пытаюсь сделать.Я владею PHP -beginner-, а мой опыт работы с веб-сервисами равен NULL.

У меня есть URL-адрес WSDL http://example.com/ws/3.1/NNE?WSDL. Я бы хотел вызвать метод searchTargetGroup из сценария PHPпоэтому я могу просмотреть ответ и сохранить данные в своей базе данных.

В любом случае, я не знаю, как создать вызов из PHP.:-( Я посмотрел на NuSOAP для PHP, а также на встроенный SoapClient, но без удачи. Я думаю проблема в том, что я пытаюсь вызвать сложный метод, не полностью понимая, что лягушка яЯ возиться с.

Так что я использовал SoapUI, чтобы получить файл определения и создать запрос, который работает отлично, и я получаю всю информацию, которую хочу. Проблема в том, что у меня нет подсказки как мне сделать PHP-файл, создающий точно такой же запрос, что и SoapUI (и, таким образом, получающий правильный ответ).

XML-запрос, сгенерированный для меня SoapUI, выглядит следующим образом:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nne="http://example.com/ws/NNE">
    <soapenv:Header/>
    <soapenv:Body>
        <nne:searchTargetGroup soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <QuestionTargetGroup_1 xsi:type="nne:QuestionTargetGroup" xmlns:nne="http://example.com/ws/NNE">
                <companyFormCodeList xsi:type="xsd:string">10,60,80</companyFormCodeList>
                <companyStatus xsi:type="xsd:string">0</companyStatus>
                <hasPhoneOnly xsi:type="xsd:boolean">true</hasPhoneOnly>
            </QuestionTargetGroup_1>
            <int_2 xsi:type="xsd:int">500</int_2>
            <int_3 xsi:type="xsd:int">1</int_3>
            <int_4 xsi:type="xsd:int">1</int_4>
            <String_5 xsi:type="xsd:string">passstring</String_5>
        </nne:searchTargetGroup>
    </soapenv:Body>
</soapenv:Envelope>

Может ли кто-нибудь помочь мне в каком-то направлении? Желательно правильный.: -)

Я знаю, что вы не можете проверить URL, так как он защищен IP, но мне бы очень хотелось знать,как сделать вышеуказанный вызов из файла / функции PHP.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

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

Используйте SoapClient вместо NuSoap.SoapClient написан на C, NuSoap на PHP, поэтому SoapClient работает быстрее.

Если с вашим WSDL-файлом все в порядке, то все, что вам нужно сделать, должно быть:

$client = new SoapClient("[URL to wsdl]");

После этого SoapClientпозаботится об остальном и сделает все процедуры, определенные в WSDL, непосредственно доступными.

$result = $client->name_of_procedure($arg1, $arg2, ...);

Результат будет иметь тип stdClass или массив с элементами типа stdClass.

БезWSDL, вам придется указать все детали самостоятельно, тип параметров, пространства имен, ... и вызывать напрямую через __ soapCall () .

В любом случае вы можете проверить структуру $ result с помощью var_dump () & Co.

1 голос
/ 23 июля 2011

Как сказал Раффаэль, вам лучше использовать SoapClient, предлагаемый PHP SOAP EXTENSION.

Для проверки вашего сервиса:

сначала объявите массив опций, где вы можете указать, например, не гоняться за wsdl (это полезно в среде разработки)

$options = array(
                'soap_version'=>SOAP_1_1,
                'exceptions'=>true,
                'trace'=>1,
                'cache_wsdl'=>WSDL_CACHE_NONE
            ); 

затем соберите клиент, начиная с вашего wsdl:

$client = new SoapClient("http://service.nnerhverv.dk/nne-ws/3.1/NNE?WSDL", $options);

вызвать метод searchTargetGroup следующим образом. Дело в том, что вы правильно строите параметр questionTargetGroup, это должно работать:

//build the parameters for the SearchTargetGroup
$questionTargetGroup = array (
    "companyFormCodeList" => "10,60,80",
    "companyStatus" => "0",
    "hasPhoneOnly" => "true"
);

$response = $client->searchTargetGroup($questionTargetGroup, 500, 1, 1, "passstring"); 

наконец распечатайте ответ, полученный вами от службы

print_r($response);
0 голосов
/ 03 августа 2011

Я написал статью о том, как вызывать веб-сервисы Serena из PHP. Но это может работать для любых веб-сервисов: http://www.geekmindsthinkalike.com/php-and-serena-web-services/

Надеюсь, это поможет

...