Project

General

Profile

Actions

Rest api with php » History » Revision 10

« Previous | Revision 10/14 (diff) | Next »
Mischa The Evil, 2011-10-05 18:25
Redid the markup of the "Known issues"-section, added references and fixed typos.


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)));
  • If you are trying to use the class to write time_entries, you will get a 404 response (#9375). The reason for that is that the class is unable to create the correct singular form from the pluralized version of the entity name.
    This can be patched in ActiveResource.php by:
    1. adding the class variable $sOriginalElementName:
      protected $sOriginalElementName = '';
    2. changing the constructor to set the class variable 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 Mischa The Evil over 12 years ago · 10 revisions