2012-01-26 19 views
17

Me gustaría aprender el uso básico de SOAP a través de este (weather) ejemplo. ¿Cómo es útil procesar esta información?Cómo usar la clase soap en php (con ejemplo)?

Solicitud:

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 

Respuesta:

<?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 Encontré información al respecto, pero no un toturial. Esocially no para php.net/manual/en/book.soap.php. Si publicas un gran artículo toturial, aceptaré tu respuesta (lo digo en grande: con eso puedo hacer este ejemplo) –

+3

Topener, no estoy de acuerdo. Este sitio es para preguntas relacionadas con la programación, no solo para el código. En la medida en que la pregunta no sea demasiado abierta, debería estar bien. Las mejores respuestas a esta pregunta serían enlaces a recursos útiles, en el manual y en otros lugares, o tal vez un ejemplo simple. –

Respuesta

43

El enfoque más simple sería:

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

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

print_r($response); 

emitiría

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> 
) 

El resto se puede analizar con SimpleXML o algo similar.

Tenga en cuenta que el tipo de respuesta es específica de este servicio web. Existen mejores servicios web, que no devuelven simplemente una cadena xml, sino que proporcionan la estructura de respuesta dentro del WSDL.


EDITAR Un ejemplo de un servicio web "más estructurado" podría ser la búsqueda GeoIP en el mismo sitio:

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

print_r($result); 

esto le da:

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

) 

ya se puede simplemente acceda a los valores invocando

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

Gran respuesta, los documentos oficiales de php http://php.net/manual/en/book.soap.php chupan. Evento después de leer su respuesta, no puedo encontrar dónde se describe su método en el manual pero funciona para mí, gracias. – Ekonoval

+1

@Ekonoval: Mi método no está documentado, porque los métodos llamados 'GetGeoIP()' y 'GetWeather()' no son métodos "reales" del SoapClient, pero se llaman mediante el método mágico '__call()'. Los nombres de los métodos están definidos en el archivo WSDL. –