Ответы пользователя по тегу SOAP
  • SOAP запрос к вебсерверу. Где ошибка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А почему не используете штатный SoapClient?
    $soapParameters = [
        'login' => 'Логин',
        'password' => 'Пароль',
        'cache_wsdl' => 0
    ];
    $soap = new SoapClient('http://example.com/service?wsdl', $soapParameters);
    $clinics = $soap->GetListClinic();
    Ответ написан
    5 комментариев
  • Что означет ошибка, которую выводит SOAP-клиент?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Читаем wsdl. Находим нужный запрос.
    operation Tracking
    <operation name="Tracking">
      <input message="tns:TrackingRequestMessage"/>
      <output message="tns:TrackingResponseMessage"/>
    </operation>

    Значит запрос Tracking принимает на вход TrackingRequestMessage. Смотрим дальше
    message TrackingRequestMessage
    <message name="TrackingRequestMessage">
      <part name="parameters" element="tns:Tracking"/>
    </message>

    Единственное поле parameters с типом Tracking. Ищем этот тип.
    element Tracking
    <xs:element name="Tracking">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="Language" type="xs:string" nillable="true"/>
          <xs:element name="Login" type="xs:string" nillable="true"/>
          <xs:element name="Password" type="xs:string" nillable="true"/>
          <xs:element name="Type" type="xs:string"/>
          <xs:element name="Documents" type="xs:string" nillable="true"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    Получаем объект или ассоциативный массив с текстовыми полями Language, Login, Password, Type и Documents, причём все поля кроме Type могут иметь значение null.
    Значит запрос должен выглядеть как
    $result = $client->Tracking([
        'Language' => ?string,
        'Login' => ?string,
        'Password' => ?string,
        'Type' => string,
        'Documents' => ?string
    ]);

    То же самое можно получить и средствами PHP. После подключения к клиенту получим список методов.
    var_dump($client->__getFunctions());
    /* ...
    [92] => string(47) "TrackingResponse Tracking(Tracking $parameters)"
    ... */

    Значит метод Tracking принимает один параметр с типом Tracking и возвращает ответ типа TrackingResponse.
    Запросим типы.
    var_dump($client->__getTypes());
    Результат запроса
    /* ...
    [120] => string(103) "struct Tracking {
     string Language;
     string Login;
     string Password;
     string Type;
     string Documents;
    }"
    [121] => string(51) "struct TrackingResponse {
     ResultTracking return;
    }"
    [24] => string(81) "struct ResultTracking {
     TrackingInfo Items;
     boolean Error;
     string ErrorInfo;
    }"
    [28] => string(227) "struct TrackingInfo {
     boolean Error;
     string Type;
     string Number;
     string Info;
     string AgentURL;
     dateTime CreateDate;
     string State;
     dateTime DeliveryDate;
     string DeliveryInfo;
     TrackingEvent History;
     Waybill Waybills;
    }"
    [27] => string(83) "struct TrackingEvent {
     dateTime EventDate;
     string EventName;
     string EventInfo;
    }"
    [31] => string(546) "struct Waybill {
     string Type;
     string Number;
     dateTime CreateDate;
     string State;
     dateTime DeliveryDate;
     string Sender;
     string SenderGeography;
     string Recipient;
     string RecipientGeography;
     string RecipientAddress;
     dateTime SendDate;
     string Payer;
     int CargoQty;
     float NetWeight;
     float GrossWeight;
     string ConsolidationNumber;
     string InventoryWaybillNumber;
     string DeliveryMethod;
     float Volume;
     boolean RequirePaymentInCash;
     float PaymentInCash;
     string PaymentInCashCurrency;
     string RecipientOfficial;
     TrackingEvent History;
    }"
    ... */


    Единственное отличие от самостоятельного анализа wsdl - не указано, какие поля необязательные, какие можно заполнять null и являются ли какие-то поля массивами.
    Ответ написан
    3 комментария
  • Почему при запросе к сервру чере SOAP выдает ошибку?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В WSDL-файле прописано
    <soapbind:address location="http://89.208.141.8:8888/CargoMSK/ws/Web1C.1cws"/>

    При этом порт 8888 данного IP-адреса никто не слушает, порт закрыт.
    Ответ написан
  • Какие есть источники для изучения Soap API?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать
  • Как работать с WSDL / SOAP в PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Нет ответа от WSDL SOAP.? Где проблема?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Судя по WSDL, авторизация сделана не средствами HTTL, а в самом бэкэнде. Значит указывать логин и пароль при создании SoapClient не нужно. Но их нужно указывать в каждом запросе, например
    $client->GetCategoryItems(['login' => $login, 'password' => $password, 'categoryId' => 1])

    Собственно, это же написано и в документации к API.
    Ответ написан
  • Как правильно написать запрос на SOAP WSDL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Смотрим описание getRefbook:
    <operation name="getRefbook">
      <documentation>
        Возвращает полную указанную версию справочника, если это возможно
      </documentation>
      <input message="typens:getRefbook"> </input>
      <output message="typens:getRefbookResponse"> </output>
    </operation>

    Видим, что на вход принимается набор параметров, описанный в typens:getRefbook. Ищем его:
    <message name="getRefbook">
      <part name="userKey" type="xsd:string"> </part>
      <part name="refbookCode" type="xsd:string"> </part>
      <part name="version" type="xsd:string"> </part>
    </message>

    То есть, нужно передать три строковых параметра. Судя по названиям, это ключ пользователя, идентификатор справочника и, предполагаю, версия api.
    $client->getRefbook([
      'userKey' => '1111f0cf-b111-1d11-a111-1cee1111d111',
      'refbookCode' => '1.2.643.5.1.13.2.1.1.194',
      'version' => '1.0'
    ]);
    Ответ написан
  • Как правильно построить запрос к SOAP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если я правильно понимаю WSDL, то у запроса getMessage единственный параметр - MessageId.
    6.1.2. Метод получения сообщения GetMessage предназначен для получения xml сообщения в соответствии с определенной для конкретного сервиса схемой.
    6.1.2.1. Сигнатура метода: GetMessageResponse GetMessage(GetMessageRequest request) throws AuthenticationException, MessageNotFoundException,
    где
    GetMessageRequest – запрос, содержащий единственный элемент MessageId – идентификатор сообщения, присвоенный запросу, который требуется передать для получения ответа.
    GetMessageResponse – ответ, содержащий 2 элемента: ProcessingStatus – статус выполнения запроса, и Message – сообщение, который позволяет содержать любой xmlс обязательным указанием схемы. ProcessingStatus – перечисление, с двумя значениями: PROCESSING –запрос обрабатывается, COMPLETED –обработка запроса завершена.
    Элемент Message возвращается только в случае,если ProcessingStatus равен COMPLETED
    https://www.nalog.ru/files/kkt/pdf/%D0%A2%D0%B5%D1...
    Ответ написан
  • Как из тегов xml сделать правильный массив PHP для SOAP в 1С?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $propertyArr = array();
    $propertyArr[] = new SoapVar(
      (object)['name' => 'Birthday', 'value' => '1999-01-01T00:00:00'],
      SOAP_ENC_OBJECT,
      'Property', 
      'core');
    $propertyArr[] = new SoapVar(
      (object)['name' => 'Duration', 'value' => '0001-01-01T00:30:00'],
      SOAP_ENC_OBJECT,
      'Property', 
      'core');
    Ответ написан
    4 комментария
  • Поможете новичку с трансляцией по SOAP-протоколу?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Судя по всему, Вам необходимо поднять свой SOAP-сервер, работающий по описанию в этом WSDL-файле. Сервер должен реализовать порт TelemetryService с методами testService, storeTelemetryList и storeTelemetry, описанными в секции wsdl:portType.
    Попробуйе начать отсюда
    Ответ написан