Sample PHP REST-Client

The following PHP-sourcecode contains a basic REST implementation for generic use.

Client Class

<?php
/**
 * A very basic REST-api client
 * 
 * @version 1.1
 * 
 */
class restapi_client {

  protected $_sEndpoint = '';

  protected $_sUrl = '';

  protected $_aHeaders = array();

  protected $_iClientTimeOut = 10;

  protected $_oResponse = false;

  /**
   * construct
   * 
   * @param $sEndpoint        string    
   * @param $sAuthHeaderKey   string
   * @param $sAuthHeaderValue string
   * @return  void
   * 
   */
  public function __construct($sEndpoint, $sAuthHeaderKey = '', $sAuthHeaderValue = ''){

    $this->_sEndpoint = $sEndpoint;

    if (!empty($sAuthHeaderKey) && !empty($sAuthHeaderValue)){

      $this->_aHeaders = [ 'Content-Type: application/json; charset=utf-8', $sAuthHeaderKey . ': ' . $sAuthHeaderValue ];

    } else {

      $this->_aHeaders = [ 'Content-Type: application/json; charset=utf-8' ];

    }

  }

  /**
   * POST method
   * 
   * @param $sEndpoint  string
   * @param $oParams  object/string
   * @param $bEncode  boolean   false => data already json-encoded
   * @return  void
   * 
   */
  public function post($sEndpoint, $oParams = false, $bEncode = true){

    $sUrl = rtrim($this->_sEndpoint, '/') . '/' . ltrim($sEndpoint, '/');

    $sParams = '';

    if ($oParams !== false){

      $bEncode === true ? $sParams = json_encode($oParams, JSON_UNESCAPED_SLASHES) : $sParams = $oParams;

    }

    $this->_sUrl = $sUrl;

    $oCurl = curl_init();
    curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->_iClientTimeOut);
    curl_setopt($oCurl, CURLOPT_POST, true);

    if (!empty($sParams)){

      curl_setopt($oCurl, CURLOPT_POSTFIELDS, $sParams);

    }

    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $this->_aHeaders);
    curl_setopt($oCurl, CURLOPT_HEADER, true);

    $oResponse = new stdClass();
    $oResponse->raw = curl_exec($oCurl);
    $oResponse->error = curl_errno($oCurl);
    $oResponse->info = curl_getinfo($oCurl);
    $oResponse->headers = mb_substr($oResponse->raw, 0, $oResponse->info['header_size']);
    $oResponse->json = mb_substr($oResponse->raw, $oResponse->info['header_size']);
    $oResponse->result = json_decode($oResponse->json);

    $this->_oResponse = $oResponse;

  }

  /**
   * PUT method
   * 
   * @param $sEndpoint  string
   * @param $oParams  object
   * @param $bEncode  boolean   false => data already json-encoded
   * @return  void
   * 
   */
  public function put($sEndpoint, $oParams = false, $bEncode = true){

    $sUrl = rtrim($this->_sEndpoint, '/') . '/' . ltrim($sEndpoint, '/');

    $sParams = '';

    if ($oParams !== false){

      $bEncode === true ? $sParams = json_encode($oParams, JSON_UNESCAPED_SLASHES) : $sParams = $oParams;

    }

    $this->_sUrl = $sUrl;

    $oCurl = curl_init();
    curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->_iClientTimeOut);
    curl_setopt($oCurl, CURLOPT_CUSTOMREQUEST, 'PUT');

    if (!empty($sParams)){

      curl_setopt($oCurl, CURLOPT_POSTFIELDS, $sParams);

    }

    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $this->_aHeaders);
    curl_setopt($oCurl, CURLOPT_HEADER, true);

    $oResponse = new stdClass();
    $oResponse->raw = curl_exec($oCurl);
    $oResponse->error = curl_errno($oCurl);
    $oResponse->info = curl_getinfo($oCurl);
    $oResponse->headers = mb_substr($oResponse->raw, 0, $oResponse->info['header_size']);
    $oResponse->json = mb_substr($oResponse->raw, $oResponse->info['header_size']);
    $oResponse->result = json_decode($oResponse->json);

    $this->_oResponse = $oResponse;

  } 

  /**
   * PATCH method
   * 
   * @param $sEndpoint  string
   * @param $oParams  object
   * @param $bEncode  boolean   false => data already json-encoded
   * @return  void
   * 
   */
  public function patch($sEndpoint, $oParams = false, $bEncode = true){

    $sUrl = rtrim($this->_sEndpoint, '/') . '/' . ltrim($sEndpoint, '/');

    $sParams = '';

    if ($oParams !== false){

      $bEncode === true ? $sParams = json_encode($oParams, JSON_UNESCAPED_SLASHES) : $sParams = $oParams;

    }

    $this->_sUrl = $sUrl;

    $oCurl = curl_init();
    curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->_iClientTimeOut);
    curl_setopt($oCurl, CURLOPT_CUSTOMREQUEST, 'PATCH');

    if (!empty($sParams)){

      curl_setopt($oCurl, CURLOPT_POSTFIELDS, $sParams);

    }

    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $this->_aHeaders);
    curl_setopt($oCurl, CURLOPT_HEADER, true);

    $oResponse = new stdClass();
    $oResponse->raw = curl_exec($oCurl);
    $oResponse->error = curl_errno($oCurl);
    $oResponse->info = curl_getinfo($oCurl);
    $oResponse->headers = mb_substr($oResponse->raw, 0, $oResponse->info['header_size']);
    $oResponse->json = mb_substr($oResponse->raw, $oResponse->info['header_size']);
    $oResponse->result = json_decode($oResponse->json);

    $this->_oResponse = $oResponse;

  } 

  /**
   * DELETE method
   * 
   * @param $sEndpoint  string
   * @param $oParams  object
   * @param $bEncode  boolean   false => data already json-encoded
   * @return  void
   * 
   */
  public function delete($sEndpoint, $oParams = false, $bEncode = true){

    $sUrl = rtrim($this->_sEndpoint, '/') . '/' . ltrim($sEndpoint, '/');

    $sParams = '';

    if ($oParams !== false){

      $bEncode === true ? $sParams = json_encode($oParams, JSON_UNESCAPED_SLASHES) : $sParams = $oParams;

    }

    $this->_sUrl = $sUrl;

    $oCurl = curl_init();
    curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->_iClientTimeOut);
    curl_setopt($oCurl, CURLOPT_CUSTOMREQUEST, 'DELETE');

    if (!empty($sParams)){

      curl_setopt($oCurl, CURLOPT_POSTFIELDS, $sParams);

    }

    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $this->_aHeaders);
    curl_setopt($oCurl, CURLOPT_HEADER, true);

    $oResponse = new stdClass();
    $oResponse->raw = curl_exec($oCurl);
    $oResponse->error = curl_errno($oCurl);
    $oResponse->info = curl_getinfo($oCurl);
    $oResponse->headers = mb_substr($oResponse->raw, 0, $oResponse->info['header_size']);
    $oResponse->json = mb_substr($oResponse->raw, $oResponse->info['header_size']);
    $oResponse->result = json_decode($oResponse->json);

    $this->_oResponse = $oResponse;

  } 

  /**
   * GET method
   * 
   * @param $sEndpoint  string
   * @param $oParams  object
   * @return  void
   * 
   */
  public function get($sEndpoint, $oParams = false){

    $sUrl = rtrim($this->_sEndpoint, '/') . '/' . ltrim($sEndpoint, '/');

    if ($oParams !== false && stripos($sUrl, '?') === false){

      $sUrl .= '?' . http_build_query($oParams);    

    }

    $this->_sUrl = $sUrl;

    $oCurl = curl_init();
    curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->_iClientTimeOut);
    curl_setopt($oCurl, CURLOPT_HTTPGET, true);
    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $this->_aHeaders);
    curl_setopt($oCurl, CURLOPT_HEADER, true);

    $oResponse = new stdClass();
    $oResponse->raw = curl_exec($oCurl);
    $oResponse->error = curl_errno($oCurl);
    $oResponse->info = curl_getinfo($oCurl);
    $oResponse->headers = mb_substr($oResponse->raw, 0, $oResponse->info['header_size']);
    $oResponse->json = mb_substr($oResponse->raw, $oResponse->info['header_size']);
    $oResponse->result = json_decode($oResponse->json);

    $this->_oResponse = $oResponse;

  }

  /**
   * Return client raw response
   * 
   * @return boolean/string
   * 
   */
  public function client_response_raw(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->raw;

  }

  /**
   * Return client error
   * 
   * @return boolean/string
   * 
   */
  public function client_response_error(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->error;

  }

  /**
   * Return client info
   * 
   * @return boolean/string
   * 
   */
  public function client_response_info(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->info;

  } 

  /**
   * Return client endpoint
   * 
   * @return array
   * 
   */
  public function client_endpoint(){

    return $this->_sUrl;

  }   

  /**
   * Return client request-headers
   * 
   * @return array
   * 
   */
  public function client_request_headers(){

    return $this->_aHeaders;

  }   

  /**
   * Return client headers
   * 
   * @return boolean/string
   * 
   */
  public function client_response_headers(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->headers;

  }   

  /**
   * Return client json result
   * 
   * @return boolean/string
   * 
   */
  public function client_response_json(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->json;

  }     

  /**
   * Return client result
   * 
   * @return boolean/string
   * 
   */
  public function client_response_result(){

    if ($this->_oResponse === false){

      return false;

    }

    return $this->_oResponse->result;

  }     

}

Usage Example

/**
 * Sample-client GoedGeplaatst REST-API
 * 
 */
require_once __DIR__ . '/class.restapi_client.php';

$oClient = new restapi_client('https://api.goedgeplaatst.nl/rest/v1/', 'Authentication', 'duid....938rfudy');

$oParams = new stdClass();
$oParams->useCache = false;
$oParams->page = 1;
$oParams->itemsPerPage = 10;

$oParams->userId = 12345;

$oOrder = new stdClass();
$oOrder->field = 'price';
$oOrder->descending = false;

$oParams->order = [$oOrder];

$oClient->get('/ads', $oParams);

print $oClient->client_response_json() . PHP_EOL;

print_r($oClient->client_response_result());