Dies ist eine alte Version des Dokuments!
Die meisten Funktionen von Redmine lassen sich auch über eine Rest-API ansprechen. Hierbei wurden Funktionen für die wichtigsten Bereiche Tickets, Projekte, Benutzer und Zeiterfassung aktuell in einer stabilen Version eingestuft. Funktionen in anderen Bereichen wie z. B. News, Wiki, Gruppen usw. befinden sich derzeit noch in Beta, Alpha oder sogar Prototype-Status. Eine vollständige Auflistung gibt es hier.
In diesem Beispiel wird der wohl wichtigste Bereich für die API beschrieben: Die Tickets. Durch die Ressource „Issue“ können Ticktes angelegt, gelesen, geändert und auch gelöscht werden. Ein typisches Anwendungsbeispiel ist die Integration in die Webseite, um Kundenanfragen vom Typ „Fehler“ und „Verbesserungsvorschlag“ automatisch direkt in ein Ticket umzuwanden.
Die Variable „key“ muss durch den API-Zugriffsschlüssel ersetzt werden der in Redmine unter „Mein Konto“ auf der rechten Seite angezeigt wird.
Redmine-Ticket-Klasse
class Redmine { private $service_url = 'http://meine-domain.de:3000/'; private $key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; public function createIssue( Issue $issueModel ) { $issue = array('issue' => $issueModel ); $curl_post_data = json_encode( $issue ); $curl = curl_init( $this->service_url . 'issues.json?key=' . $this->key ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json') ); curl_setopt( $curl, CURLOPT_POSTFIELDS, $curl_post_data ); $result = $this->execute( $curl ); return $result->issue->id; } /** * @param integer $id * @return Issue */ public function getIssue( $id ) { $curl = curl_init( $this->service_url . 'issues/' . $id . '.json?key=' . $this->key ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json') ); curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, "GET"); $result = $this->execute( $curl ); if( $result === null ) { return null; } $issueModel = new Issue(); $issueModel->subject = $result->issue->subject; $issueModel->description = $result->issue->description; $issueModel->assigned_to_id = $result->issue->assigned_to->id; $issueModel->priority_id = $result->issue->priority->id; $issueModel->status_id = $result->issue->status->id; $issueModel->tracker_id = $result->issue->tracker->id; return $issueModel; } public function updateIssue( Issue $issueModel, $id ) { $issue = array('issue' => $issueModel ); $curl_post_data = json_encode( $issue ); $curl = curl_init( $this->service_url . 'issues/' . $id . '.json?key=' . $this->key ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json') ); curl_setopt( $curl, CURLOPT_POSTFIELDS, $curl_post_data ); $result = $this->execute( $curl ); if( $result === '' ) { return true; } return false; } public function deleteIssue( $id ) { $curl = curl_init( $this->service_url . 'issues/' . $id . '.json?key=' . $this->key ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json') ); curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, "DELETE"); $result = $this->execute( $curl ); if( $result === '' ) { return true; } return false; } /** * @return mixed */ private function execute( $curl ) { $curl_response = curl_exec( $curl ); if( $curl_response === false ) { $info = curl_getinfo( $curl ); curl_close( $curl ); die( 'error occured during curl exec. Additioanl info: ' . var_export( $info ) ); } curl_close( $curl ); $decoded = json_decode( $curl_response ); if( isset( $decoded->errors ) ) { die( 'error occured: ' . print_r( $decoded->errors, 1 ) ); } return $decoded; } }
Redmine-Ticket-Model
class RedmineIssue { const TRACKER_BUG=1, TRACKER_FEATURE=2, TRACKER_SUPPORT=3; const PRIO_NIEDRIG=1, PRIO_NORMAL=2, PRIO_HOCH=3, PRIO_DRINGEND=4, PRIO_SOFORT=5; const STATUS_NEU=1, STATUS_ZUGEWIESEN=2, STATUS_GELOEST=3; const STATUS_RUECKFRAGE=4, STATUS_ERLEDIGT=5, STATUS_ABGEWIESEN=6; public $project_id = 1; public $subject = ''; public $description = ''; public $category_id = NULL; public $tracker_id = 2; public $priority_id = 2; public $status_id = 1; public $assigned_to_id = NULL; public $is_private = false; public $notes = ''; public $private_notes = false; }