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
- adding the class var
protected $sOriginalElementName = '';
- 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)))); ...
- 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 about 13 years ago · 9 revisions