2012-01-26 13 views
17

Chciałbym nauczyć się podstawowych zastosowań SOAP w tym przykładzie (weather). Jak to jest warte przetwarzania tych danych?Jak używać klasy mydła w php (z przykładem)?

Zapytanie:

POST /globalweather.asmx HTTP/1.1 
Host: www.webservicex.net 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <GetWeather xmlns="http://www.webserviceX.NET"> 
     <CityName>string</CityName> 
     <CountryName>string</CountryName> 
    </GetWeather> 
    </soap12:Body> 
</soap12:Envelope> 
HTTP/1.1 200 OK 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

Response:

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <GetWeatherResponse xmlns="http://www.webserviceX.NET"> 
     <GetWeatherResult>string</GetWeatherResult> 
    </GetWeatherResponse> 
    </soap12:Body> 
</soap12:Envelope> 
+0

@Topener Znalazłem informacje na ten temat, ale nie było to totalne. Eseciowo nie dla php.net/manual/en/book.soap.php. Jeśli opublikujesz wielki toturial, przyjmuję twoją odpowiedź (Wielkim słowem: z tym mogę zrobić ten przykład) –

+3

Topener, nie zgadzam się. Ta strona służy do pytań związanych z programowaniem, nie tylko do kodu. O ile pytanie nie jest zbyt otwarte, powinno być w porządku. Świetną odpowiedzią na to pytanie będą linki do przydatnych zasobów, w podręczniku i gdzie indziej, a może prosty przykład. –

Odpowiedz

43

Najprostszym rozwiązaniem byłoby:

$requestParams = array(
    'CityName' => 'Berlin', 
    'CountryName' => 'Germany' 
); 

$client = new SoapClient('http://www.webservicex.net/globalweather.asmx?WSDL'); 
$response = $client->GetWeather($requestParams); 

print_r($response); 

byłoby wyjście

stdClass Object 
(
    [GetWeatherResult] => <?xml version="1.0" encoding="utf-16"?> 
<CurrentWeather> 
    <Location>Berlin-Tegel, Germany (EDDT) 52-34N 013-19E 37M</Location> 
    <Time>Jan 26, 2012 - 07:50 AM EST/2012.01.26 1250 UTC</Time> 
    <Wind> from the SE (130 degrees) at 14 MPH (12 KT):0</Wind> 
    <Visibility> greater than 7 mile(s):0</Visibility> 
    <SkyConditions> mostly clear</SkyConditions> 
    <Temperature> 33 F (1 C)</Temperature> 
    <Wind>Windchill: 23 F (-5 C):1</Wind> 
    <DewPoint> 21 F (-6 C)</DewPoint> 
    <RelativeHumidity> 59%</RelativeHumidity> 
    <Pressure> 30.27 in. Hg (1025 hPa)</Pressure> 
    <Status>Success</Status> 
</CurrentWeather> 
) 

Resztę można następnie przeanalizować za pomocą SimpleXML lub czegoś podobnego.

Należy pamiętać, że rodzaj reakcji jest specyficzny dla tej usługi WWW. Istnieją lepsze usługi internetowe, które nie zwracają po prostu łańcucha xml, ale raczej dostarczają strukturę odpowiedzi w WSDL.


EDIT Przykładem "bardziej uporządkowanego" usługa może być odnośnika GeoIP w tym samym miejscu:

$client = new SoapClient('http://www.webservicex.net/geoipservice.asmx?WSDL'); 
$result = $client->GetGeoIP(array('IPAddress' => '8.8.8.8')); 

print_r($result); 

to daje:

stdClass Object 
(
    [GetGeoIPResult] => stdClass Object 
     (
      [ReturnCode] => 1 
      [IP] => 8.8.8.8 
      [ReturnCodeDetails] => Success 
      [CountryName] => United States 
      [CountryCode] => USA 
     ) 

) 

Teraz możesz wystarczy uzyskać dostęp do wartości, wywołując

$country = $result->GetGeoIPResult->CountryName; 
+0

Świetna odpowiedź, ofsional php docs http://php.net/manual/en/book.soap.php ssać. Wydarzenie po przeczytaniu odpowiedzi Nie mogę znaleźć, gdzie twoja metoda jest opisana w instrukcji, ale działa dla mnie, dzięki. – Ekonoval

+1

@Ekonoval: Moja metoda nie jest udokumentowana, ponieważ nazwy metod 'GetGeoIP()' i 'GetWeather()' nie są "prawdziwymi" metodami SoapClient, ale są wywoływane za pomocą magicznej metody '__call()'. Nazwy metod są zdefiniowane w pliku WSDL. –

Powiązane problemy