Project

General

Profile

Rest api with php » History » Revision 9

Revision 8 (B Brey, 2011-01-06 21:49) → Revision 9/14 (Robert Nürnberg, 2011-10-05 12:31)

h1. Using the REST API with PHP 

 Here is an example that uses "PHP ActiveResource":http://wiki.github.com/lux/phpactiveresource/, a lightweight PHP library that can be used to access Rails' REST APIs: 

 <pre> 
 <code class="php"> 
 <?php 
 require_once ('ActiveResource.php'); 

 class Issue extends ActiveResource { 
     var $site = 'http://username:password@192.168.199.129:3000/'; 
     var $request_format = 'xml'; // REQUIRED! 
 } 

 // create a new issue 
 $issue = new Issue (array ('subject' => 'XML REST API', 'project_id' => '1')); 
 $issue->save (); 
 echo $issue->id; 

 // find issues 
 $issues = $issue->find ('all'); 
 for ($i=0; $i < count($issues); $i++) { 
	 echo $issues[$i]->subject; 
 } 

 // find and update an issue 
 $issue->find (1); 
 echo $issue->subject; 
 $issue->set ('subject', 'This is the new subject')->save (); 

 // delete an issue 
 $issue->find (1); 
 $issue->destroy (); 
 ?> 
 </code> 
 </pre> 

 *Known issues* 

 If you are working with large descriptions the webserver can return a 417 error (Bad Expectation). 
 You should replace line 381 in ActiveResource.php with the following code: 

 <pre>curl_setopt ($ch, CURLOPT_HTTPHEADER, array ('Expect:',"Content-Type: text/xml", "Length: " . strlen ($params)));</pre> 

 *2011-10-05:* 
 If you are trying to use the class to write time_entries, you will get a 404 response. The reasone is, that the class is unable to create the correct singular form from the pluralized version of the entitiy name. this can be patched by 

 # adding the class var <code class="php">protected $sOriginalElementName = '';</code> 
 # changing the constructor to set the class var using the original entity name before the pluralization is called:  
 <code class="php"> 
 function __construct ($data = array ()) { 
   $this->_data = $data; 

   // add this line here - to store the original name of the entity 
   $this->sOriginalElementName = ($this->element_name ? $this->element_name : strtolower (get_class ($this))); 
   // Allow class-defined element name or use class name if not defined 
   $this->element_name = ($this->element_name ? $this->pleuralize ($this->element_name) : $this->pleuralize (strtolower (get_class ($this)))); 
 ... 
 </code> 
 # and then Changing the Method _send_and_receive to use sOriginalElementName instead of substr ($this->element_name, 0, -1); 
 <code class="php"> 
 function _send_and_receive ($url, $method, $data = array ()) { 
   $params = ''; 
   $el = $this->sOriginalElementName;//substr ($this->element_name, 0, -1); 
   if ($this->request_format == 'url') { 
 ... 
 </code>