Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP & SOAP
jacek21
post 5.02.2013, 19:04:11
Post #1





Grupa: Zarejestrowani
Postów: 52
Pomógł: 2
Dołączył: 13.06.2012

Ostrzeżenie: (0%)
-----


Witam,

Jestem aktualnie na etapie czyania pewnej książki i dotarłem do typów usług sieciowych. No i pojawił się problem nie dokońca chyba rozumiem zagadnienie SOAP.
Jeśli byłby ktoś kto miał z tym doczynienia byłbym wdzięczny, gdyby odpowiedział mi na poniższe pytania:

Jak korzystać z SOAP(mile widziane przykłądy)?

Do czego SOAP może być przydatne(tylko nie na przykładzie walut(takie moje fanaberie biggrin.gif))

Może małe porady jak to ugryść od strony PHP, jakiś tuturial, kurs cokolwiek(szukałem, ale nie znalazłem nic co byłoby napisane w stylu soapClient - służy do tego tamtego, przykład, przeglądałem manuala, lecz jeszcze mój angielski lekko kuleje a poza tym opisy są tak 'obszerne', że dla człowieka, który nie wiem na temat SOAP prawie nic niewiele pomagają)?

mile widziane dodatkowe informacje ^^
Go to the top of the page
+Quote Post
stefano_F
post 7.02.2013, 00:52:12
Post #2





Grupa: Zarejestrowani
Postów: 18
Pomógł: 4
Dołączył: 1.02.2013

Ostrzeżenie: (0%)
-----


Też od niedawna mam do czynienia z SOAP, muszę powiedzieć że bardzo mi się to spodobało.
Z tego co ja zrozumiałem, to SOAP służy do udostępniania, dla klientów zdalnych, funkcji które wykonywane są na serwerze na którym usługa SOAP działa. Do czego można wykożysać? W zasadzie do wszystkiego :-).

Jeżeli chodzi o obsługę po stronie klienta, to jest banalna:
  1. $soap = new SoapClient(null, array('location' => 'http://adres.serwera.z.soap', 'uri' => ' ' ));
  2. $wynik = $soap->zdalnaFunkcjaDODAJ(3, 5);
  3.  
  4. print $wynik;

W przykładzie zdalny serwer SOAP udostępnia funkcje która dodaje dwie liczby podane jako parametry. Klient wywołuje tą funkcje wraz z żądanymi parametrami, zdalny serwer ją wykonuje (w przykładzie liczy ile to jest 3+5) i zwraca wynik do klienta. Ciało funkcji na serwerze wyglądać może mniej więcej tak:
  1. function zdalnaFunkcjaDODAJ($a, $b)
  2. {
  3. return $a+$b;
  4. }

Przykład bardzo trywialny, ale chodzi zrozumienie sensu. Popularnym przykładem zastosowania w praktyce są właśnie kursy walut. Na serwerze jest baza danych z nazwą waluty, kursem i datą. SOAP udostępnia funkcje np. podajKurs($data, $waluta, $kurs). Ty jako klient wykonujesz 2 proste polecenia:
1. tworzenie obiektu soap i połączenie się ze zdalnym serwerem
2. wywołanie funkcji
Nie musisz zastanawiać się jak wygląda baza danych, łączenia się z nią, wybierania selectem z warunkami aby otrzymać określony rezultat.

Innym przykładem mogą być systemy do masowego wysyłania smsów. Serwery firm oferujących takie usługi "coś tam robią", a ty dostajesz funkcje wyslijSMS($lista_numerow, $tresc) i nawet sie nie zastanawiasz nad tym, co ten serwer będzie robił i jak długo.

Mam nadzieję, że trochę rozjaśniłem kwestię - przynajmniej od strony obsługi po stronie klienta.

Pozdrawiam
Stefan
Go to the top of the page
+Quote Post
Puszy
post 7.02.2013, 11:10:13
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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
  1. class TestWS extends SoapClient{
  2.  
  3. private $WSDL = 'http://domena.pl/ws.wsdl';
  4.  
  5. public function __construct(){
  6. parent::SoapClient($this->WSDL);
  7. }
  8.  
  9. /**
  10. * @return Pobierz_produkt_OUT
  11. * @param int $id_produktu
  12. */
  13. public function pobierz_produkt($id_produktu){
  14. $query = new Pobierz_produkt_IN();
  15. $query->id_produktu = $id_produktu;
  16.  
  17. return $this->__soapCall('Pobierz_produkt', array($query));
  18. // lub
  19. return $this->Pobierz_produkt($query);
  20. }
  21.  
  22. }


Modele wejścia i wyjścia (nie są potrzebne ale baardzo pomagają w dalszej pracy)
  1. class Pobierz_produkt_IN{
  2. /**
  3. * @var int
  4. */
  5. public $id_produktu;
  6. }
  7.  
  8. class Pobierz_produkt_OUT{
  9. /**
  10. * @var int
  11. */
  12. public $id;
  13.  
  14. /**
  15. * @var string
  16. */
  17. public $nazwa;
  18.  
  19. /**
  20. * @var float
  21. */
  22. public $cena;
  23. }


Fragment WSDL na podstawie którego tworzysz modele
  1. <xsd:complexType name="Pobierz_produkt_IN">
  2. <xsd:all>
  3. <xsd:element name="id_produktu" type="xsd:int" nillable="false"/>
  4. </xsd:all>
  5. </xsd:complexType>
  6. <xsd:complexType name="Pobierz_produkt_OUT">
  7. <xsd:all>
  8. <xsd:element name="id" type="xsd:int" nillable="true"/>
  9. <xsd:element name="nazwa" type="xsd:string" nillable="true"/>
  10. <xsd:element name="cena" type="xsd:float" nillable="true"/>
  11. </xsd:all>
  12. </xsd:complexType>


Frament odpowiadający za nazwę funkcji
  1. <operation name="Pobierz_produkt">
  2. <documentation>Pobierz_produkt: zwraca dane o pordukcie</documentation>
  3. <input message="tns:Pobierz_produkt_REQUEST"/>
  4. <output message="tns:Pobierz_produkt_RESPONSE"/>
  5. </operation>


i na końcu samo wywołanie zapytania i wyświetlenie danych
  1. $test_ws = new TestWS();
  2. $id_produktu = 133;
  3.  
  4.  
  5. $call = $test_ws->pobierz_produkt($id_produktu);
  6.  
  7. print_r("Pordukt o id ".$id_produktu." ma nazwę ".$call->nazwa." i kosztuje ".$call->cena." PLN");
  8.  


Jeżeli masz więcej pytań, napisz post smile.gif

Ten post edytował Puszy 7.02.2013, 11:10:49
Go to the top of the page
+Quote Post
sazian
post 7.02.2013, 19:05:50
Post #4





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


przykład:
http://allegro.pl/webapi/documentation.php
możesz założyć konto testowe tutaj http://testwebapi.pl/
Go to the top of the page
+Quote Post
jacek21
post 9.02.2013, 15:37:31
Post #5





Grupa: Zarejestrowani
Postów: 52
Pomógł: 2
Dołączył: 13.06.2012

Ostrzeżenie: (0%)
-----


No po takich odpowiedziach wszytsko staje się jasnę. Aktualnie jestem w trakcie wykonywania projektu, więc muszę usługi sieciowe odłożyć trochę na później, ale wygląda bardzo zachęcająco ^^

Dziękuję bardzo za odpowiedzi ^^
jeśli będę miał jakieś pytania, odezwe się jeszczę tu smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2025 - 03:48