Created
March 4, 2014 23:38
-
-
Save karloscarweber/9358095 to your computer and use it in GitHub Desktop.
A Rest Request component for CakePHP 2.0. I figured that I use this component so much that I might as well make it it's own repository.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// App/controllers/components/rest_request.php | |
// shamelessly lifted from: http://www.gen-x-design.com/archives/making-restful-requests-in-php/ | |
// slightly modified | |
class RestRequestComponent extends Object | |
{ | |
var $components = array('Session'); | |
protected $url; | |
protected $verb; | |
protected $requestBody; | |
protected $requestLength; | |
protected $username; | |
protected $password; | |
protected $acceptType; | |
protected $responseBody; | |
protected $responseInfo; | |
public function __construct ($url = null, $verb = 'GET', $requestBody = null) | |
{ | |
$this->url = $url; | |
$this->verb = $verb; | |
$this->requestBody = $requestBody; | |
$this->requestLength = 0; | |
$this->username = null; | |
$this->password = null; | |
$this->acceptType = 'application/json'; | |
$this->responseBody = null; | |
$this->responseInfo = null; | |
if ($this->requestBody !== null) | |
{ | |
$this->buildPostBody(); | |
} | |
} | |
public function flush () | |
{ | |
$this->requestBody = null; | |
$this->requestLength = 0; | |
$this->verb = 'GET'; | |
$this->responseBody = null; | |
$this->responseInfo = null; | |
} | |
public function execute () | |
{ | |
$ch = curl_init(); | |
$this->setAuth($ch); | |
try | |
{ | |
switch (strtoupper($this->verb)) | |
{ | |
case 'GET': | |
$this->executeGet($ch); | |
break; | |
case 'POST': | |
$this->executePost($ch); | |
break; | |
case 'PUT': | |
$this->executePut($ch); | |
break; | |
case 'DELETE': | |
$this->executeDelete($ch); | |
break; | |
default: | |
throw new InvalidArgumentException('Current verb (' . $this->verb . ') is an invalid REST verb.'); | |
} | |
} | |
catch (InvalidArgumentException $e) | |
{ | |
curl_close($ch); | |
throw $e; | |
} | |
catch (Exception $e) | |
{ | |
curl_close($ch); | |
throw $e; | |
} | |
} | |
public function buildPostBody ($data = null) | |
{ | |
$data = ($data !== null) ? $data : $this->requestBody; | |
if (!is_array($data)) | |
{ | |
throw new InvalidArgumentException('Invalid data input for postBody. Array expected'); | |
} | |
$data = http_build_query($data, '', '&'); | |
$this->requestBody = $data; | |
} | |
protected function executeGet ($ch) | |
{ | |
$this->doExecute($ch); | |
} | |
protected function executePost ($ch) | |
{ | |
if (!is_string($this->requestBody)) | |
{ | |
$this->buildPostBody(); | |
} | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody); | |
curl_setopt($ch, CURLOPT_POST, 1); | |
$this->doExecute($ch); | |
} | |
protected function executePut ($ch) | |
{ | |
if (!is_string($this->requestBody)) | |
{ | |
$this->buildPostBody(); | |
} | |
$this->requestLength = strlen($this->requestBody); | |
$fh = fopen('php://memory', 'rw'); | |
fwrite($fh, $this->requestBody); | |
rewind($fh); | |
curl_setopt($ch, CURLOPT_INFILE, $fh); | |
curl_setopt($ch, CURLOPT_INFILESIZE, $this->requestLength); | |
curl_setopt($ch, CURLOPT_PUT, true); | |
$this->doExecute($ch); | |
fclose($fh); | |
} | |
protected function executeDelete ($ch) | |
{ | |
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); | |
$this->doExecute($ch); | |
} | |
protected function doExecute (&$curlHandle) | |
{ | |
$this->setCurlOpts($curlHandle); | |
$this->responseBody = curl_exec($curlHandle); | |
$this->responseInfo = curl_getinfo($curlHandle); | |
curl_close($curlHandle); | |
} | |
protected function setCurlOpts (&$curlHandle) | |
{ | |
curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10); | |
curl_setopt($curlHandle, CURLOPT_URL, $this->url); | |
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); | |
if( isset( $_SESSION['login_token'] ) ){ | |
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array ( | |
'Accept: ' . $this->acceptType, | |
'X-Pipejump-Auth: ' . $_SESSION['login_token'])); | |
}else { | |
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array ('Accept: ' . $this->acceptType)); | |
} | |
} | |
protected function setAuth (&$curlHandle) | |
{ | |
if ($this->username !== null && $this->password !== null) | |
{ | |
curl_setopt($curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); | |
curl_setopt($curlHandle, CURLOPT_USERPWD, $this->username . ':' . $this->password); | |
} | |
} | |
public function getAcceptType () | |
{ | |
return $this->acceptType; | |
} | |
public function setAcceptType ($acceptType) | |
{ | |
$this->acceptType = $acceptType; | |
} | |
public function getPassword () | |
{ | |
return $this->password; | |
} | |
public function setPassword ($password) | |
{ | |
$this->password = $password; | |
} | |
public function getResponseBody () | |
{ | |
return $this->responseBody; | |
} | |
public function getResponseInfo () | |
{ | |
return $this->responseInfo; | |
} | |
public function getUrl () | |
{ | |
return $this->url; | |
} | |
public function setUrl ($url) | |
{ | |
$this->url = $url; | |
} | |
public function getUsername () | |
{ | |
return $this->username; | |
} | |
public function setUsername ($username) | |
{ | |
$this->username = $username; | |
} | |
public function getVerb () | |
{ | |
return $this->verb; | |
} | |
public function setVerb ($verb) | |
{ | |
$this->verb = $verb; | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment