326 lines
7.4 KiB
PHP
326 lines
7.4 KiB
PHP
<?php
|
|
|
|
if($_SERVER['REQUEST_METHOD'] == 'POST')
|
|
{
|
|
|
|
$data = str_replace('\n', '', $_POST['body']);
|
|
$data = str_replace(' ', '', $data);
|
|
$data = stripslashes($data);
|
|
$request = new RestRequest($_POST['url'], $_POST['method'], $data);
|
|
$request->setUsername('qwe');
|
|
$request->setPassword('qwe');
|
|
$request->execute();
|
|
}
|
|
|
|
?><!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>REST API demo</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
</head>
|
|
<body>
|
|
|
|
<h1>REST API demo</h1>
|
|
<form method="post">
|
|
<p>
|
|
<labe>Method</label><br>
|
|
<select name="method">
|
|
<option value="GET" <?php if(isset($_POST['method']) && $_POST['method'] == 'GET') print "selected"; ?>>GET</option>
|
|
<option value="PUT" <?php if(isset($_POST['method']) && $_POST['method'] == 'PUT') print "selected"; ?>>PUT</option>
|
|
<option value="POST" <?php if(isset($_POST['method']) && $_POST['method'] == 'POST') print "selected"; ?>>POST</option>
|
|
<option value="DELETE" <?php if(isset($_POST['method']) && $_POST['method'] == 'DELETE') print "selected"; ?>>DELETE</option>
|
|
</select>
|
|
</p>
|
|
<p>
|
|
<labe>URL</label><br>
|
|
<input type="text" size="100" name="url" value="<?php if(isset($_POST['url']))print $_POST['url']; else print "http://simpla".dirname($_SERVER['REQUEST_URI'])."/products/"; ?>">
|
|
</p>
|
|
<p>
|
|
<labe>Body:</label><br>
|
|
<textarea cols="100" rows="20" name="body"><?php if(isset($_POST['body'])) print stripslashes($_POST['body']) ?></textarea><br>
|
|
<input type="submit" value="Send">
|
|
</p>
|
|
<p>
|
|
<labe>Response:</label><br>
|
|
<textarea cols="100" rows="20" name="response"><?php if(is_object($request)) print stripslashes(indent($request->getResponseBody())); ?></textarea>
|
|
</p>
|
|
<p>
|
|
<labe>Response Info:</label><br>
|
|
<textarea cols="100" rows="20" name="response_info"><?php if(is_object($request)){ $info = $request->getResponseInfo(); stripslashes(print_r($info)); }?></textarea>
|
|
</p>
|
|
</form>
|
|
</body>
|
|
</html>
|
|
<?php
|
|
|
|
|
|
class RestRequest
|
|
{
|
|
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;
|
|
$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_PATHINFO, $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);
|
|
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_BASIC);
|
|
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;
|
|
}
|
|
}
|
|
|
|
function indent($json) {
|
|
|
|
$result = '';
|
|
$pos = 0;
|
|
$strLen = strlen($json);
|
|
$indentStr = ' ';
|
|
$newLine = "\n";
|
|
$prevChar = '';
|
|
$outOfQuotes = true;
|
|
|
|
for ($i=0; $i<=$strLen; $i++) {
|
|
|
|
// Grab the next character in the string.
|
|
$char = substr($json, $i, 1);
|
|
|
|
// Are we inside a quoted string?
|
|
if ($char == '"' && $prevChar != '\\') {
|
|
$outOfQuotes = !$outOfQuotes;
|
|
|
|
// If this character is the end of an element,
|
|
// output a new line and indent the next line.
|
|
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
|
|
$result .= $newLine;
|
|
$pos --;
|
|
for ($j=0; $j<$pos; $j++) {
|
|
$result .= $indentStr;
|
|
}
|
|
}
|
|
|
|
// Add the character to the result string.
|
|
$result .= $char;
|
|
|
|
// If the last character was the beginning of an element,
|
|
// output a new line and indent the next line.
|
|
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
|
|
$result .= $newLine;
|
|
if ($char == '{' || $char == '[') {
|
|
$pos ++;
|
|
}
|
|
|
|
for ($j = 0; $j < $pos; $j++) {
|
|
$result .= $indentStr;
|
|
}
|
|
}
|
|
|
|
$prevChar = $char;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|