Project

General

Profile

Actions

Rest api with php » History » Revision 9

« Previous | Revision 9/14 (diff) | Next »
Robert Nürnberg, 2011-10-05 12:31


Using the REST API with PHP

Here is an example that uses PHP ActiveResource, a lightweight PHP library that can be used to access Rails' REST APIs:

<?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 ();
?>

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:

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

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

  1. adding the class var protected $sOriginalElementName = '';
  2. changing the constructor to set the class var using the original entity name before the pluralization is called:
    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)))); ...
  3. and then Changing the Method _send_and_receive to use sOriginalElementName instead of substr ($this->element_name, 0, -1);
    function _send_and_receive ($url, $method, $data = array ()) { $params = ''; $el = $this->sOriginalElementName;//substr ($this->element_name, 0, -1); if ($this->request_format == 'url') { ...

Updated by Robert Nürnberg over 12 years ago · 9 revisions