Od ponad roku pracuję z SOAP'em na PHP, konkretnie tworzę połączenie 3 niezależnych WMSów korzystając właśnie z Web Service'ów. Na początku byłem bardzo zadowolony z takiego rozwiązania. Nie trzeba znać bazy danych, niemal wszystko można robić w locie korzystając jedynie z niewielkiej bazy z tabelami pomocniczymi. Po około pół roku gdy zaczęto wymagać ciut więcej sprawy się skomplikowały. Oczywiście wszystko zależy kto udostępnia owy WS i jak nim zarządza. Jak wspomniałem wcześniej korzystam z 3 Web Service'ów, i żaden nie pozwala mi pobrać danych "różnych od". Dla przykładu: gdy chcę pobrać listę zamówień gdzie nazwisko klienta jest różne od "Nowak", jestem zmuszony do pobrania wszystkich zamówień (możliwe jest zawężenie wyszukiwań, np podaj zamówienia tylko ze statusu 2.2 etc.) a następnie przefiltrowania ich pod kątem szukanego nazwiska. Zaczyna robić się nieciekawie przy większej ilości danych. All in all jest to dość dobre rozwiązanie, można je łatwo przenosić na inne języki.
Jeżeli chodzi o samo programowanie polecam pracę w Eclipse + tworzenie modeli obiektów. Każdy szanujący się WS posiada informacje opisujące go w pliku WSDL. Plik ma strukturę XMLa i zawiera wszystkie niezbędne informacje dotyczące korzystania z WS. Bardzo przydatne jest tworzenie modeli dla poszczególnych zapytań. Każde zapytania działa w dwie strony, wejście i wyjście. Dla przykładu poniżej połączenie + pobranie produktu (na zasadzie funkcji) + modele.
Klasa tworząca połączenie + gotowa funkcja do pobrania produktu
class TestWS extends SoapClient{
private $WSDL = 'http://domena.pl/ws.wsdl';
public function __construct(){
parent::SoapClient($this->WSDL);
}
/**
* @return Pobierz_produkt_OUT
* @param int $id_produktu
*/
public function pobierz_produkt($id_produktu){
$query = new Pobierz_produkt_IN();
$query->id_produktu = $id_produktu;
return $this->__soapCall
('Pobierz_produkt', array($query)); // lub
return $this->Pobierz_produkt($query);
}
}
Modele wejścia i wyjścia (nie są potrzebne ale baardzo pomagają w dalszej pracy)
class Pobierz_produkt_IN{
/**
* @var int
*/
public $id_produktu;
}
class Pobierz_produkt_OUT{
/**
* @var int
*/
public $id;
/**
* @var string
*/
public $nazwa;
/**
* @var float
*/
public $cena;
}
Fragment WSDL na podstawie którego tworzysz modele
<xsd:complexType name="Pobierz_produkt_IN">
<xsd:all>
<xsd:element name="id_produktu" type="xsd:int" nillable="false"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="Pobierz_produkt_OUT">
<xsd:all>
<xsd:element name="id" type="xsd:int" nillable="true"/>
<xsd:element name="nazwa" type="xsd:string" nillable="true"/>
<xsd:element name="cena" type="xsd:float" nillable="true"/>
</xsd:all>
</xsd:complexType>
Frament odpowiadający za nazwę funkcji
<operation name="Pobierz_produkt">
<documentation>Pobierz_produkt: zwraca dane o pordukcie</documentation>
<input message="tns:Pobierz_produkt_REQUEST"/>
<output message="tns:Pobierz_produkt_RESPONSE"/>
</operation>
i na końcu samo wywołanie zapytania i wyświetlenie danych
$test_ws = new TestWS();
$id_produktu = 133;
$call = $test_ws->pobierz_produkt($id_produktu);
print_r("Pordukt o id ".$id_produktu." ma nazwę ".$call->nazwa." i kosztuje ".$call->cena." PLN");
Jeżeli masz więcej pytań, napisz post