REST-Webservice mit PHP ansprechen

REST-Webservice mit PHP ansprechen

In diesem Beitrag geht es um das Ansprechen eines REST-Webservices mittels PHP, wobei der REST-Webservice die Ergebnisse mit Hilfe von JSON zurückliefert. REST steht für Representational State Transfer und stellt eine Möglichkeit zur Implementierung einer Schnittstelle dar. Rückgaben können auf verschiedene Arten erfolgen, z.B. durch XML oder JSON. Das Ansprechen eines SOAP-Webservices ist mit Hilfe der in PHP eingebauten Soap-Klasse möglich (SoapClient). Für das Arbeiten mit einem REST-Webservice kann beispielsweise auf cURL zurückgegriffen werden, was auch Inhalt dieses Beitrags sein wird.

Methode zum Aufruf des Services

public function callAPI($data = false)
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_POST, 1);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	$ret = curl_exec($curl);
	if ($ret === false) {
		$ret = null;
	}
	curl_close($curl);
	return $ret;
}

Zunächst wird mit curl_init(); eine neue cURL-Instanz erzeugt. Post-Daten können eingesetzt werden (curl_setopt($curl, CURLOPT_POSTFIELDS, $data);) und die URL zum Webservice wird gesetzt (curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);). Anschließend wird der Service aufgerufen und der Rückgabewert zurückgegeben ($ret = curl_exec($curl);). Wichtig ist, dass vor der Rückgabe die cURL-Verbindung geschlossen wird (curl_close($curl);).

Methode zum Auslesen der JSON-Rückgabe

Angenommen, in der Rückgabe stecken Benutzerinformationen als JSON-Objekt, kann das Auslesen mit folgende Methode vorgenommen werden:

public function getUserEntityFromInfo($userInfo) {
	$obj = json_decode($userInfo);
	if ($obj && isset($obj->{'username'})) {
		$user = new UserEntity();
		$user->setuserName($obj->{'username'});
		$user->setemail($obj->{'useremail'});
		return $user;
	}
	return null;
}

Dabei wird zunächst das JSON-Objekt anhand des Strings erzeugt ($obj = json_decode($userInfo);). Beinhaltet das Objekt username, so werden username und useremail ausgelesen. Die Klasse UserEntity besteht in diesem Beispiel lediglich aus Getter- und Setter-Methoden.

Die komplette Klasse

class RestExample {
	
	private $serviceUrl = "https://www.myservice.com/servicename";
	
	public function callAPI($data = false)
	{
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
		$ret = curl_exec($curl);
		if ($ret === false) {
			$ret = null;
		}
		curl_close($curl);
		return $ret;
	}
	
	public function getUserEntityFromInfo($userInfo) {
		$obj = json_decode($userInfo);
		if ($obj && isset($obj->{'username'})) {
			$user = new UserEntity();
			$user->setuserName($obj->{'username'});
			$user->setemail($obj->{'useremail'});
			return $user;
		}
		return null;
	}
}

Aufruf der Klasse

Das folgende Beispiel zeigt, wie diese Klasse aufgerufen und Post-Werte übergeben werden können.

$restClient = new RestExample();
$curlPostData = array(
		'MyFirstProperty' => 123,
		'MySecondEntry' => "testdata"
);
$ret = $restClient->callAPI($curlPostData);
if ($ret != null) {
	$user = $restClient->getUserEntityFromInfo($ret);
	if ($user != null) {
		echo $user->getuserName();
	}
	else {
		echo "Benutzerinformationen konnten nicht geladen werden.";
	}
}
else {
	echo "Keine Rückgabe nach Webservice-Aufruf erhalten.";
}

Chrome-Extension zum Testen eines REST-Webservices

Zum Schnellen Testen eines REST-Webservices, bietet sich die Google Chrome-Extension Advance REST Client an. Mit dieser Extension können sowohl GET- als auch POST-Requests getestet werden und das Übergeben von Variablen ist möglich.

Anmerkungen

Die hier gezeigten Beispiele sind bewusst recht simpel gehalten. Das Aufrufen eines REST-Webservices wird gezeigt und es ist ersichtlich, wie POST-Daten übergeben werden können. Auch das Erzeugen eines JSON-Objektes wird gezeigt.