Nano Hash - криптовалюты, майнинг, программирование

Получение данных из веб-службы WSDL в PHP

Начну с того, что понятия не имею, что я пытаюсь сделать. Мои навыки PHP - начинающие, а мой опыт работы с веб-сервисами - 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.

21.07.2011

Ответы:


1

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

Используйте 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.

21.07.2011
  • На самом деле я пробовал это раньше, но он вернул фатальную ошибку: Неперехваченное исключение SoapFault: [Клиент] SOAP-ОШИБКА: Кодировка: объект не имеет свойства «район». Владелец службы WSDL сказал мне, что я должен просто пропустить поля, о которых я не спрашивал, например поле района. Я только что попробовал со всеми полями, определенными в вызове, просто пустыми для тех, о которых я не хотел спрашивать, и теперь это работает. Пара свежих глаз была как раз тем, что мне было нужно, чтобы продолжить. Спасибо Рафаэль :) 21.07.2011

  • 2

    Как сказал Рафаэль, вам лучше использовать 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);
    
    23.07.2011

    3

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

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

    02.08.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..