WEB-Сервисы с нуля... (на пальцах для программиста 1с)

Despod

Новичок
Доброго времени суток.

Хоть и давно я зарегистрирован на данном форуме, но программистом PHP по сути не являюсь, пишу в основном для себя. Последние пять лет занимаюсь разработкой в среде 1с.

После работы с польским веб-сервисом( из 1с ), пришла идея создать некий сервис на PHP, чтоб он так же красиво работал с 1с.

Думал разберусь, но не тут то было.

Итак задача следующая: Создать функцию, которая бы возвращала XDTO-объект поставщика по его ИНН. На входе ИНН тип строка, на выходе объект
-Наименование поставщика
-Адрес
-Телефон
Задача намного сложнее, но для понимания достаточно будет и этого.

Свой путь я конечно начал с гугла. Самой путной статьей оказалась эта http://phpclub.ru/detail/article/soap?printVersion=1, но код из этого примера у меня так и не заработал.

Подскажите самый простой путь для создание своего веб-сервиса, желательно без подключения каких то библиотек(ибо программиста 1с пугают такие слова как перекомпилировать PHP с таким то ключом :) )
 

WMix

герр M:)ller
Партнер клуба
Самой путной статьей оказалась эта http://phpclub.ru/detail/article/soap?printVersion=1, но код из этого примера у меня так и не заработал.
я начал бы от сюда, но вообще трудно понять что значит "так и не заработал"... звучит также как и "я читал про 1с, но так и не понял!"
ибо программиста 1с пугают такие слова как перекомпилировать PHP с таким то ключом
меня тоже пугают (бывают еще хуже слова, проинсталлировать - уж очень хардверно), а что делать? (тут нужно заметить что php программеры компилять ежеминутно)... или я программист, или пользователь 1с
 

Despod

Новичок
Вчерашние ошибки победил, появились новые.
Упростил задачу, хочу просто получить в ответ на функцию без параметров строку "OK"
Создал три файла.

server.php
<?php

function test() {
return "ok";
}

ini_set("soap.wsdl_cache_enabled", "0"); // отключаем кэширование WSDL
$server = new SoapServer("xxx.wsdl");
$server->addFunction("test");
$server->handle();
?>

client.php
<?php
ini_set("soap.wsdl_cache_enabled", "0"); // отключаем кэширование WSDL
$client = new SoapClient("xxx.wsdl");
print_r($client->test());
?>

ну и сам wdsl файл.
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.xxx.org/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd1="http://www.xxx.org/soap/"
name="xxxorg"
targetNamespace="http://www.xxx.org/soap/">

<types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs1="http://www.xxx.org/soap/" targetNamespace="http://www.xxx.org/soap/" elementFormDefault="qualified">
<xs:element name="test">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:element name="testResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>

<message name="testRequestMessage">
<part name="parameters" element="tns:test"/>
</message>
<message name="testResponseMessage">
<part name="parameters" element="tns:testResponse"/>
</message>
<portType name="xxxorgPortType">
<operation name="test">
<input message="tns:testRequestMessage"/>
<output message="tns:testResponseMessage"/>
</operation>
</portType>
<binding name="xxxorgSoapBinding" type="tns:xxxorgPortType">
<soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="test">
<soapbind:eek:peration style="document" soapAction="http://www.xxx.org/soap/#xxxorg1:test"/>
<input>
<soapbind:body use="literal"/>
</input>
<output>
<soapbind:body use="literal"/>
</output>
</operation>
</binding>
<binding name="xxxorgSoap12Binding" type="tns:xxxorgPortType">
<soap12bind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="test">
<soap12bind:eek:peration style="document" soapAction="http://www.xxx.org/soap/#xxxorg:test"/>
<input>
<soap12bind:body use="literal"/>
</input>
<output>
<soap12bind:body use="literal"/>
</output>
</operation>
</binding>
<service name="xxxorg">
<port name="xxxorgSoap" binding="tns:xxxorgSoapBinding">
<documentation>
<wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/" conformsTo="http://ws-i.org/profiles/basic/1.1"/>
</documentation>
<soapbind:address location="http://xxx.org/ws/server.php"/>
</port>
<port name="xxxorgSoap12" binding="tns:xxxorgSoap12Binding">
<soap12bind:address location="http://xxx.org/ws/server.php"/>
</port>
</service>
</definitions>

****************************************************************************
При вызове клиента со строкой print($client->test());
вызывает ошибку Catchable fatal error: Object of class stdClass could not be converted to string in.

При вызове клиента со строкой print_r($client->test());
stdClass Object ( )
OK мне не вернулось. Подозреваю что ошибка в WDSL, данный формат мне любезно подготовила 1с(но честно говоря я ему не особо доверяю.)

нашел статью Пишем web-сервис на PHP и Zend_Soap "http://freehabr.ru/blog/php/951.html"
Zend_Soap выбран не зря. Это прекрасная библиотека для создания web-сервисов. Она избавляет нас от нужды «ручками» описывать WSDL (язык описания web-сервисов и доступа к ним, основанный на языке XML)
Но честно я понятия не имею как этот Zend_Soap прикрутить к сайту. У меня хостинг где нет доступа к PHP.INI
 

WMix

герр M:)ller
Партнер клуба
мягкосердечный я наверное, почитал твой код,
да WSDL негодный,
<message name="testRequestMessage">
<part name="parameters" element="tns:test"/>
</message>

<message name="testResponseMessage">
<part name="parameters" element="tns:testResponse"/>
</message>
уже точно типы не соблюдены тут, в request понятия не имею, у тебя нет переменных возможно должно стоять tns:void не уверен, читать лень....
в ответе точно ждешь tns:string далее если чесно не разбирался, ты используешь soap12bind пространство, я его еще не читал....

вот тебе простой сервис, я его попробывал, он работает
http://jimmyzimmerman.com/blog/2007/02/soap-server-with-php5-part-1.html

вообще конечно писать WSDL умеют готовые библиотеки, но всеже заинтересуйся
 
Сверху