web-dev-qa-db-fra.com

Comment utiliser la classe soap en php (avec exemple)?

Je voudrais apprendre l'utilisation de base de SOAP à travers cet exemple ( météo ). Comment est-il utile de traiter ces données?

Demande:

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

Réponse:

<?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>
19
user669677

L'approche la plus simple serait:

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

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

print_r($response);

sortirait

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

Le reste peut ensuite être analysé avec SimpleXML ou quelque chose de similaire.

Notez que le type de réponse est spécifique à ce service Web. Il existe de meilleurs services Web, qui ne renvoient pas simplement une chaîne xml, mais fournissent plutôt la structure de réponse dans le WSDL.


EDIT Un exemple de service Web "plus structuré" pourrait être la recherche GeoIP sur le même site:

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

print_r($result);

cela vous donne:

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

)

Maintenant, vous pouvez simplement accéder aux valeurs en appelant

$country = $result->GetGeoIPResult->CountryName;
47
Dan Soap