Я хотел бы изучить базовое использование SOAP через этот ( погодный ) пример. Как это целесообразно обрабатывать эти данные?
Запрос:
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
Отклик:
<?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>
Самый простой подход:
$requestParams = array( 'CityName' => 'Berlin', 'CountryName' => 'Germany' ); $client = new SoapClient('http://www.webservicex.net/globalweather.asmx?WSDL'); $response = $client->GetWeather($requestParams); print_r($response);
выводит
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> )
Остальное можно разобрать SimpleXML или что-то подобное.
Обратите внимание, что тип ответа специфичен для этой веб-службы. Там есть лучшие веб-службы, которые не просто возвращают строку xml, а скорее предоставляют структуру ответа в WSDL.
EDIT Примером «более структурированного» веб-сервиса может быть поиск GeoIP на одном сайте:
$client = new SoapClient('http://www.webservicex.net/geoipservice.asmx?WSDL'); $result = $client->GetGeoIP(array('IPAddress' => '8.8.8.8')); print_r($result);
это дает вам:
stdClass Object ( [GetGeoIPResult] => stdClass Object ( [ReturnCode] => 1 [IP] => 8.8.8.8 [ReturnCodeDetails] => Success [CountryName] => United States [CountryCode] => USA ) )
Теперь вы можете просто получить доступ к значениям, вызвав
$country = $result->GetGeoIPResult->CountryName;