Combinatie API zowel RESTful als SOAP, in php met een WSDL
/**
* AOZ Soap Class
*/
class soapServiceFunctions {
public $authorized = false;
public $testmode = false;
/**
* Check auhtorization
*/
function authorization($header) {
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
global $_SERVER;
if ( isset($header->username) && isset($header->hash) )
{
if ( $header->username == "testuser" && $header->hash == "7f3be433c9bab15315e23fbb4664d33c6074211b" ) {
$this->authorized = true;
$this->testmode = true;
$this->userData["userid"] = 1;
} else {
$this->userData = $this->auth->checkWSDLAccess($header->username, $header->hash, $_SERVER["REMOTE_ADDR"]);
if ( $this->userData ) $this->authorized = true;
$this->userData["userid"] = $this->userData["id"];
}
}
}
/**
* Exception handler
*/
function serviceAPIException($errNr, $msg, $call)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
switch ( $this->serviceType ) {
case "SOAP":
$this->soap->fault($errNr, $msg, $call, "Contact the AOZ support department on 076 - 74 10 100.");
break;;
default:
throw new Exception($errNr . "::" . $msg . "::" . $call . "]->" . "Contact the AOZ support department on 076 - 74 10 100.");
break;;
}
}
/**
* Request for bag (basisregistratie adressen information ...
*/
function someFunction(
$firstName,
$lastName,
) {
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
return(
array(
"processData" => $this->serviceConversion($this->procData),
"aozBagRequest" => $this->serviceConversion($rs),
"dataResources" => null
)
);
}
/**
* Convert to API
*/
function serviceConversion($dataSet)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
switch ( $this->serviceType ) {
case "SOAP":
return(new SoapVar($dataSet, SOAP_ENC_OBJECT));
break;;
default:
return($dataSet);
break;;
}
}
/**
* API Constructor ...
*/
function __construct($soapService, $sql, $auth, $crypt, $conversionTbl, $serviceType = "SOAP")
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
global $logData;
$this->logData = &$logData;
$this->soap = $soapService;
$this->sql = $sql;
$this->auth = $auth;
$this->crypt = $crypt;
$this->conversionTbl = $conversionTbl;
$this->serviceType = $serviceType;
$this->logData["API"] = $serviceType;
$this->locationImages = true;
$this->imageHashes = array();
$this->procData = array(
"calls" => 0,
"resources" => 0,
"runtime" => microtime(true),
"date" => time(),
"errors" => 0,
"warnings" => 0,
"images" => 0,
"timezone" => date_default_timezone_get()
);
}
}
/**
* RESTful API class
*/
abstract class RESTFullAPI extends soapServiceFunctions {
/**
* Request vars
*/
protected $method = "";
protected $endpoint = "";
protected $verb = "";
protected $args = Array();
protected $file = null;
protected $username = "";
protected $hash = "";
/**
* API Entrypoint
*/
/**
* Response function
*/
function __response($data, $statusCode = 200)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
header("HTTP/1.1 " . $statusCode . " " . $this->__requestStatus($statusCode));
return json_encode($data);
}
/**
* Cleanup input data
*/
function __cleanInput($data)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
$clean_input = Array();
if (is_array($data)) {
foreach ($data as $k => $v) {
$clean_input[$k] = $this->__cleanInput($v);
}
} else {
$clean_input = trim(strip_tags($data));
}
return $clean_input;
}
/**
* Check request status
*/
function __requestStatus($statusCode)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
$statusCodes = array(
200 => "OK",
404 => "Not Found",
405 => "Method Not Allowed",
500 => "Internal Server Error"
);
return($statusCodes[$statusCode] ? $statusCodes[$statusCode] : $statusCodes[500]);
}
/**
* RESTful API constructor
*/
function __construct($requestInput)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
global $server, $sql, $auth, $crypt, $conversionTbl, $apiClass;
$apiClass = $this;
/**
* Response headers
*/
header("Access-Control-Allow-Orgin: *");
header("Access-Control-Allow-Methods: *");
header("Content-Type: application/json");
/**
* Parse arguments
*/
$this->args = explode("/", rtrim($requestInput));
$this->endpoint = array_shift($this->args);
$this->method = $_SERVER["REQUEST_METHOD"];
/**
* Check request method
*/
if ( $this->method == "POST" && array_key_exists("HTTP_X_HTTP_METHOD", $_SERVER) )
{
switch ( $_SERVER["HTTP_X_HTTP_METHOD"] ) {
case "DELETE":
case "PUT":
$this->method = $_SERVER["HTTP_X_HTTP_METHOD"];
break;;
default:
$this->serviceAPIException("400", "Unexpected headers found ...", __CLASS__ . "::" . __FUNCTION__);
break;;
}
}
/**
* Parse data for correct REQUEST method
*/
switch ( $this->method ) {
case "DELETE":
case "POST":
$this->request = $this->__cleanInput($_POST);
break;;
case "GET":
$this->request = $this->__cleanInput($_GET);
break;;
case "PUT":
$this->request = $this->__cleanInput($_GET);
$this->file = file_get_contents("php://input");
break;;
default:
$this->__response("Invalid method", 405);
break;;
}
parent::__construct($server, $sql, $auth, $crypt, $conversionTbl, "RESTFUL");
}
/**
* Get Arguments from class
*/
function getArgs()
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
return($this->args);
}
function processAPI() {
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
if (method_exists($this, $this->endpoint)) {
$cc = 0;
$arguments = "";
foreach ($this->args as $var ) {
$varList[$cc] = $var;
$arguments .= "\$varList[$cc], ";
$cc++;
}
$reflection = new ReflectionMethod('soapServiceClass', $this->endpoint);
if ( $reflection->getNumberOfRequiredParameters() > $cc ) {
$this->serviceAPIException("428", "Required arguments missing ...", __CLASS__ . "::" . __FUNCTION__);
} else {
$arguments = substr($arguments, 0, strlen($arguments) - 2);
$call = "\$result = \$this->{\$this->endpoint}(" . $arguments . ");";
eval($call);
return $this->__response($result);
}
}
return $this->__response("No Endpoint: $this->endpoint", 404);
}
/**
* RESTful API deconstructor
*/
function __deconstruct()
{
}
}
/**
* This RESTful API entrypoint
*/
class RESTApi extends RESTFullAPI {
/**
* API Constructor
*/
function __construct($request, $origin, $start)
{
logSysCall(( __CLASS__ == "" ? __FUNCTION__ : __METHOD__), __LINE__, __FILE__);
$request = strstr($request, $start);
parent::__construct($request);
if ( isset($this->request["username"]) && isset($this->request["hash"]) )
{
/**
* Are we a test user?
*/
if ( $this->request["username"] == "testuser" && $this->request["hash"] == "7f3be433c9bab15315e23fbb4664d33c6074211b" ) {
$this->authorized = true;
$this->testmode = true;
$this->userData["userid"] = 1;
} else {
/**
* Check user WSDL access
*/
$this->userData = $this->auth->checkWSDLAccess($this->request["username"], $this->request["hash"], $_SERVER["REMOTE_ADDR"]);
if ( $this->userData ) $this->authorized = true;
$this->userData["userid"] = $this->userData["id"];
}
} else {
$this->serviceAPIException("400", "Missing authorization parameters ...", __CLASS__ . "::" . __FUNCTION__);
}
}
}
/**
* Check API request type, RESTful / SOAP
*/
$requestHeaders = getallheaders();
$logData["headers"] = json_encode($requestHeaders);
$logData["url"] = $_SERVER["REQUEST_URI"];
$logData["rawRequest"] = file_get_contents("php://input");
$logData["ip"] = $_SERVER["REMOTE_ADDR"];
/**
* API Processing
*/
if ( array_key_exists("SOAPAction", $requestHeaders) || isset($_GET["wsdl"]) ) {
/**
* SOAP/API Service Entrypoint
*/
if ( isset($_GET["wsdl"]) ) {
header("Content-type: text/xml");
/**
* AOZ_WSE_ENDPOINT_PEOPLE_SEARCH Set service endpoint
*/
echo str_replace("%%AOZ_WSE_ENDPOINT_PEOPLE_SEARCH%%", AOZ_WSE_ENDPOINT_PEOPLE_SEARCH, file_get_contents("aozWse.wsdl"));
} else {
$soapServiceOptions = array(
"soap_version" => SOAP_1_2,
"cache_wsdl" => WSDL_CACHE_NONE,
"send_errors" => true
);
$server = new SoapServer("aozWse.wsdl", $soapServiceOptions);
$server->setClass("soapServiceClass", $server, $sql, $auth, $crypt, $conversionTbl);
$server->handle();
}
$logData["vars"] = "";
} else {
/**
* RESTful API Service Entrypoint
*/
if ( array_key_exists("request", $_REQUEST) ) {
if (!array_key_exists('HTTP_ORIGIN', $_SERVER)) {
$_SERVER['HTTP_ORIGIN'] = $_SERVER['SERVER_NAME'];
}
try {
$API = new RESTApi($_REQUEST['request'], $_SERVER['HTTP_ORIGIN'], $_REQUEST['start']);
echo $API->processAPI();
$logData["vars"] = json_encode($API->getArgs());
} catch (Exception $e) {
echo json_encode(Array('error' => $e->getMessage()));
}
} else {
echo "RESTful API Endpoint";
}
}