$answer = file_get_contents('http://path/to.php?key=ABC&name=Ray');
var_dump($answer);
<?php
/**
* Demonstrate the basics of cURL GET-method request
* http://curl.haxx.se/libcurl/c/libcurl-errors.html
*/
error_reporting(E_ALL);
// READ FROM AN API WITH cURL
$response = new Get_Response_Object('http://path/to.php?key=ABC&name=Ray');
// SHOW THE ERROR MESSAGE OR THE SUCCESS WORK PRODUCT
if (!$response->document) var_dump($response);
echo htmlentities($response->document);
Class GET_Response_Object
{
public $href, $title, $http_code, $errno, $info, $document;
public function __construct($href, $get_array=[], $title=NULL)
{
// ACTIVATE THIS TO AVOID TIMEOUT FOR LONG RUNNING SCRIPT
// set_time_limit(10);
// STORE THE CALL INFORMATION
$this->href = $href;
$this->title = $title;
// PREPARE THE GET STRING
$get_string = http_build_query($get_array);
if ($get_string) $get_string = '?' . $get_string;
// MAKE THE REQUEST
if (!$this->my_curl($href, $get_string))
{
// ACTIVATE THIS TO SEE THE ERRORS AS THEY OCCUR
// trigger_error("Errno: $this->errno; HTTP: $this->http_code; URL: $this->href", E_USER_WARNING);
}
}
protected function my_curl($url, $get_string, $timeout=3)
{
// PREPARE THE CURL CALL
$curl = curl_init();
// HEADERS AND OPTIONS APPEAR TO BE A FIREFOX BROWSER REFERRED BY GOOGLE
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: "; // BROWSERS USUALLY LEAVE THIS BLANK
// SET THE CURL OPTIONS - SEE http://php.net/manual/en/function.curl-setopt.php
curl_setopt( $curl, CURLOPT_URL, $url . $get_string );
curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, $header );
curl_setopt( $curl, CURLOPT_REFERER, 'http://www.google.com' );
curl_setopt( $curl, CURLOPT_ENCODING, 'gzip,deflate' );
curl_setopt( $curl, CURLOPT_AUTOREFERER, TRUE );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, TRUE );
curl_setopt( $curl, CURLOPT_TIMEOUT, $timeout );
curl_setopt( $curl, CURLOPT_VERBOSE, TRUE );
curl_setopt( $curl, CURLOPT_FAILONERROR, TRUE );
// SET THE LOCATION OF THE COOKIE JAR (WILL BE OVERWRITTEN)
curl_setopt( $curl, CURLOPT_COOKIEFILE, 'cookie.txt' );
curl_setopt( $curl, CURLOPT_COOKIEJAR, 'cookie.txt' );
// IF USING SSL, THIS INFORMATION MAY BE IMPORTANT
// http://php.net/manual/en/function.curl-setopt.php#110457
// http://php.net/manual/en/function.curl-setopt.php#115993
// http://php.net/manual/en/function.curl-setopt.php#113754
// REDACTED IN 2015 curl_setopt( $curl, CURLOPT_SSLVERSION, 3 );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
// RUN THE CURL REQUEST AND GET THE RESULTS
$this->document = curl_exec($curl);
$this->errno = curl_errno($curl);
$this->info = curl_getinfo($curl);
$this->http_code = $this->info['http_code'];
curl_close($curl);
// RETURN DOCUMENT OR FALSE ON CURL FAILURE
return $this->document;
}
}
<?php // demo/REST_get_last_name.php
error_reporting(E_ALL);
// DEMONSTRATE HOW A RESTFUL WEB SERVICE WORKS
// INPUT FIRST NAME, OUTPUT FAMILY NAME
// PHP CALLING EXAMPLE -- READ THE URI:
// file_get_contents('http://iconoun.com/demo/REST_get_last_name.php?key=ABC&resp=XML&name=Ray');
// OUR DATA MODEL CONTAINS ALL THE ANSWERS - THIS COULD BE A DATA BASE - AS SIMPLE OR COMPLEX AS NEEDED
$dataModel
= array
( 'Brian' => 'Portlock'
, 'Ray' => 'Paseur'
, 'COBOL' => 'Dinosaur'
, 'Dave' => 'Baldwin'
)
;
// RESPONSE CAN BE PLAIN TEXT OR XML FORMAT
$alpha = NULL;
$omega = NULL;
// NORMALIZE AND TEST THE "resp=" ARGUMENT
if ( (isset($_GET["resp"])) && (strtoupper(trim($_GET["resp"])) == 'XML') )
{
// PREPARE THE XML WRAPPER
$alpha = '<?xml version="1.0" encoding="utf-8" ?>' . PHP_EOL . '<response>' . PHP_EOL;
$omega = PHP_EOL . '</response>';
}
// TEST THE 'API KEY' - THIS COULD BE A DATA BASE VALIDATION LOOKUP - AS SIMPLE OR COMPLEX AS NEEDED
$key = (!empty($_GET["key"])) ? $_GET["key"] : FALSE;
if ($key !== 'ABC')
{
die( $alpha . 'INVALID API KEY' . $omega );
}
// LOOKUP THE FAMILY NAME
$name = (!empty($_GET["name"])) ? $_GET["name"] : 'MISSING name= PARAMETER';
// IF THE NAME FROM THE URL IS FOUND IN THE DATA MODEL
if (array_key_exists($name, $dataModel))
{
// RETURNS THE APPROPRIATE FAMILY NAME FROM THE DATA MODEL
die( $alpha . $dataModel[$name] . $omega );
}
else
{
// RETURNS THE UNKNOWN NAME INDICATOR
die( $alpha . "$name (UNKNOWN)" . $omega );
}
<?php // demo/REST_version.php
error_reporting(E_ALL);
// DEMONSTRATE HOW A WEB SERVICE CAN PROVIDE ITS VERSION NUMBER IN THE RESPONSE
// PHP CALLING EXAMPLE -- READ THE URI:
// file_get_contents('http://iconoun.com/demo/REST_version.php?key=ABC&resp=JSON');
// PREPARE THE XML WRAPPER
$xml = <<<EOD
<?xml version="1.0" encoding="utf-8" ?>
<response>
</response>
EOD;
// MAKE AN OBJECT FROM THE XML
$obj = SimpleXML_Load_String($xml);
// ADD VERSION NUMBER
$obj->addChild('version');
$obj->version = '1.0';
// ADD ERROR INFORMATION SHOWING NO ERRORS
$obj->addChild('error');
$obj->error->addChild('code');
$obj->error->code = 0;
$obj->error->addChild('message');
// NORMALIZE AND TEST THE API KEY
$key = (!empty($_GET['key'])) ? strtoupper(trim($_GET['key'])) : NULL;
if ($key != 'ABC')
{
// IF THE KEY FAILS, SET AN ERROR INDICATOR
$obj->error->code = 'Fatal';
$obj->error->message = 'Invalid API Key';
// NO FURTHER PROCESSING - JUST RESPOND
goto PrepResponse;
}
// ADD API RESPONSE INFORMATION (EXAMPLE: ABOUT A PERSON)
$obj->addChild('person');
$obj->person->addChild('name');
$obj->person->addChild('email');
$obj->person->name = 'Ray';
$obj->person->email = 'Ray.Paseur@Gmail.com';
// PREPARE THE RESPONSE DOCUMENT FROM THE OBJECT
PrepResponse:
// NORMALIZE AND TEST THE RESPONSE TYPE
$resp = (!empty($_GET['resp'])) ? strtoupper(trim($_GET['resp'])) : NULL;
// CHOOSE JSON IF REQUESTED OR XML IF NOT
if ($resp == 'JSON')
{
$out = json_encode($obj);
}
else
{
$out = $obj->AsXML();
}
// RETURN THE RESPONSE
echo $out;
<?php // demo/REST_deprecation.php
error_reporting(E_ALL);
// DEMONSTRATE HOW A WEB SERVICE CAN PROVIDE A DEPRECATION NOTICE IN THE RESPONSE
// PHP CALLING EXAMPLE -- READ THE URI:
// file_get_contents('http://iconoun.com/demo/REST_deprecation.php?key=ABC&resp=JSON');
// PREPARE THE XML WRAPPER
$xml = <<<EOD
<?xml version="1.0" encoding="utf-8" ?>
<response>
</response>
EOD;
// MAKE AN OBJECT FROM THE XML
$obj = SimpleXML_Load_String($xml);
// ADD VERSION NUMBER
$obj->addChild('version');
$obj->version = '2.4';
// ADD ERROR INFORMATION SHOWING NO ERRORS
$obj->addChild('error');
$obj->error->addChild('code');
$obj->error->code = 0;
$obj->error->addChild('message');
// NORMALIZE AND TEST THE API KEY
$key = (!empty($_GET['key'])) ? strtoupper(trim($_GET['key'])) : NULL;
if ($key != 'ABC')
{
// IF THE KEY FAILS, SET AN ERROR INDICATOR
$obj->error->code = 'Fatal';
$obj->error->message = 'Invalid API Key';
// NO FURTHER PROCESSING - JUST RESPOND
goto PrepResponse;
}
// ADD API RESPONSE INFORMATION (EXAMPLE: ABOUT A PERSON)
$obj->addChild('person');
$obj->person->addChild('name');
$obj->person->addChild('email');
$obj->person->name = 'Ray';
$obj->person->email = 'Ray.Paseur@Gmail.com';
// PREPARE THE RESPONSE DOCUMENT FROM THE OBJECT
PrepResponse:
// BECAUSE THIS API IS DEPRECATED, WE ADD A NOTICE TO THE ERROR INFORMATION FIELDS
$obj->error->code = 'Notice';
$obj->error->message = 'This version of the API is Deprecated; please upgrade to Version 3';
// NORMALIZE AND TEST THE RESPONSE TYPE
$resp = (!empty($_GET['resp'])) ? strtoupper(trim($_GET['resp'])) : NULL;
// CHOOSE JSON IF REQUESTED OR XML IF NOT
if ($resp == 'JSON')
{
$out = json_encode($obj);
}
else
{
$out = $obj->AsXML();
}
// RETURN THE RESPONSE
echo $out;
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (4)
Commented:
Commented:
Any article that uses my name for test data is bound to be a winner. ;^)
Seriously a good clear starter for something that can get really complex and easily messed up.
Cd&
Commented:
Commented: