PHP Eine REST Schnittstelle implementieren

XHotSniperX

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
472
Hallo Leute

ich möchte auf meiner Seite REST implementieren. Ich hab bis heute nichts von REST gehört aber jetzt hab ich es kurz versucht auf meiner Testseite zu implementieren.

Ich habe diese Seite dabei angeschaut und wollte das einfach mal probieren. http://net.tutsplus.com/tutorials/other/a-beginners-introduction-to-http-and-rest/

Auf meiner Testseite möchte ich nun das Besipiel von dem Tutorial testen. Ich habe dazu einen Ordner "clients" erstellt und die server.php Datei und eine .htaccess Datei reinkopiert.

Wenn ich nun http://fahrschule.taess.net/clients/ aufrufe, dann kommt leider kein json raus. Wisst ihr wieso das nicht klappt?

Hier die zwei files im Ordner clients:


PHP:
<?php

/*
Copyright 2010 Ludovico Fischer. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list
   of conditions and the following disclaimer in the documentation and/or other materials
   provided with the distribution.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

class Server {
    /* The array key works as id and is used in the URL
       to identify the resource.
    */
    private $contacts = array('jim' => array('address' => '356 Trailer Park Avenue', 'url' => '/clients/jim'),
                              'anne' => array('address' => '6321 Tycoon Road', 'url'=> '/clients/anne')
);

    public function serve() {
      
        $uri = $_SERVER['REQUEST_URI'];
        $method = $_SERVER['REQUEST_METHOD'];
        $paths = explode('/', $this->paths($uri));
        array_shift($paths); // Hack; get rid of initials empty string
        $resource = array_shift($paths);
      
        if ($resource == 'clients') {
            $name = array_shift($paths);
	
            if (empty($name)) {
                $this->handle_base($method);
            } else {
                $this->handle_name($method, $name);
            }
          
        } else {
            // We only handle resources under 'clients'
            header('HTTP/1.1 404 Not Found');
        } 
    }
        
    private function handle_base($method) {
        switch($method) {
        case 'GET':
            $this->result();
            break;
        default:
            header('HTTP/1.1 405 Method Not Allowed');
            header('Allow: GET');
            break;
        }
    }

    private function handle_name($method, $name) {
        switch($method) {
        case 'PUT':
            $this->create_contact($name);
            break;

        case 'DELETE':
            $this->delete_contact($name);
            break;
      
        case 'GET':
            $this->display_contact($name);
            break;

        default:
            header('HTTP/1.1 405 Method Not Allowed');
            header('Allow: GET, PUT, DELETE');
            break;
        }
    }

    private function create_contact($name){
        if (isset($this->contacts[$name])) {
            header('HTTP/1.1 409 Conflict');
            return;
        }
        /* PUT requests need to be handled
         * by reading from standard input.
         */
        $data = json_decode(file_get_contents('php://input'));
        if (is_null($data)) {
            header('HTTP/1.1 400 Bad Request');
            $this->result();
            return;
        }
        $this->contacts[$name] = $data; 
        $this->result();
    }
    
    private function delete_contact($name) {
        if (isset($this->contacts[$name])) {
            unset($this->contacts[$name]);
            $this->result();
        } else {
            header('HTTP/1.1 404 Not Found');
        }
    }
    
    private function display_contact($name) {
        if (array_key_exists($name, $this->contacts)) {
            echo json_encode($this->contacts[$name]);
        } else {
            header('HTTP/1.1 404 Not Found');
        }
    }
    
    private function paths($url) {
        $uri = parse_url($url);
        return $uri['path'];
    }
    
    /**
     * Displays a list of all contacts.
     */
    private function result() {
        header('Content-type: application/json');
        echo json_encode($this->contacts);
    }
  }

$server = new Server;
$server->serve();

?>

.htaccess:

Code:
RewriteEngine on
RewriteRule ^/.* /server.php
 
Code:
RewriteEngine on
RewriteRule ^.* server.php
 
Zuletzt bearbeitet:
damit wird die php nicht gefunden :(

mit

Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* server.php/$0 [L]

kommt was ganz komisches. die homepage
 
Zuletzt bearbeitet:
du musst auch den Slash vor server.php entfernen also:
RewriteRule ^.* server.php
 
ja das hab ich am anfang so getestet :)

Edit:
ah jetzt hats geklappt. ich musste mich ausloggen und jetzt ging es. sehr komisch. Danke dir auf jeden Fall :)
 
Zuletzt bearbeitet:
Also der Code sieht wirklich sehr abenteuerlich aus, vor alle viel Boilerplate-Code der für jede REST-Resource dupliziert werden muss. Schonmal in Betracht gezogen z.B. Silex oder Slim Framework dafür zu nutzen? Dank dem Sinatra-Stil würde sich die Art perfekt für REST eignen (natürlich auch für anderes).
 
Zurück
Oben