2011-11-28 27 views
31

"Czyste adresy URL", znane również jako "adresy URL RESTful", są przyjazne dla użytkownika, mają charakter czysto strukturalny i nie zawierają ciągu zapytania. Zamiast tego zawierają tylko ścieżkę zasobu.Używanie czystych adresów URL w RESTful API

czyli: "http://twitter.com/users/show/"+username+".json"

Pytania o funkcjonalność po stronie serwera:

  1. Czy muszę tworzyć unikalny skrypt API po stronie serwera dla każdego katalogu?

  2. Czy mogę przesłać wszystkie żądania do tylko jednego skryptu, jeśli tak, jak mogę wyciągnąć użyteczne informacje ze struktury Czysty URL ($ _GET ['url_structure'])?

  3. Dlaczego wywołanie twittera do pliku .json z pewnością nie istnieje. Musi być generowany na żądanie. Jak działa to ? To prowadzi mnie do przekonania, że ​​odpowiedź na pytanie 2 jest twierdząca.

+1

Czyste adresy URL nie mają nic wspólnego z usługą REST apis. To po prostu fajny sposób na upiększanie adresów URL, które w przeciwnym razie miałyby brzydkie ciągi zapytań. Zwykle są one implementowane za pomocą mod_rewrite, aby pobrać czysty adres URL i wewnętrznie przekształcić go z powrotem do wersji z ciągiem zapytań. –

Odpowiedz

53

1) Nie, jeśli użyć relaksującego ram jak RecessPHP lub jeśli używasz reguły mod_rewrite w pliku .htaccess aby przekierować wszystkie żądania API do pojedynczego pliku PHP (znany jako kontrolera frontowego).

.htaccess

RewriteEngine On 
RewriteRule ^/api/ api.php 

api.php

$request = $_SERVER['REQUEST_URI']; //this would be /users/show/abc.json 

2) Można użyć modułu przepisywania Apache przekierować wszystkie żądania API specjalny Plik PHP, który je obsługuje. W zależności od konfiguracji apache, oryginalny żądany (RESTful) adres URL będzie przechowywany w zmiennej serwerowej w PHP, uważam, że jest to $_SERVER['REQUEST_URI']. Oczywiście można również po prostu przekazać zmienną $_GET[] do PHP zawierającą URL REST.

.htaccess

RewriteEngine On 
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2 

api.php

$request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc') 
$file_type  = $_GET['type']; 

$output = get_data_from_db(); //Do your processing here 
           //You can outsource to other files via an include/require 

//Output based on request 
switch($file_type) { 
    case 'json': 
     echo json_encode($output); 
     break; 
    case 'xml': 
     echo xml_encode($output); //This isn't a real function, but you can make one 
     break; 
    default: 
     echo $output; 
} 

3) Twitter (i wiele innych API) to wykorzystać, ponieważ jest to wygodny sposób dostarczanie formatu oczekiwanego przez aplikację z interfejsu API. Wszystkie żądania API są przekierowywane do pojedynczego pliku PHP, który obsługuje tworzenie wszystkich plików i wysyłanie ich treści do wyjścia. Plik nigdy nie jest przechowywany na serwerze (chyba że jest buforowany).


dobrych zasobów


Wzmiankę o n RecessPHP. Jest to z pewnością świetne narzędzie i zachęcam do obejrzenia go (być może u źródła, aby uzyskać pojęcie o tym, jak to przetwarza rzeczy), ale to powiedziawszy, wydaje mi się to trochę nieostrożne. Fakt, że nazwy ścieżek są pisane w specjalnych komentarzach, wydaje mi się bardzo nie-PHP. Oddaliłbym się od tego i nie nazwałbym tego idealną ramą, ale to na pewno początek. Powodzenia!

+2

Dzięki za niesamowitą odpowiedź, którą naprawiłeś. Zwykle oddalam się od frameworków, chyba że oszczędza mi to dużo czasu. Ale na pewno sprawdzę Recess. –

+0

Ja również szukałem wskazówek na temat wdrażania RESTful URLs po stronie serwera. Podejrzewałem, że Front Controller jest zaangażowany, więc dziękuję za jasność. To jest świetna odpowiedź. – ComethTheNerd

+0

@Bailey Parker :: Podane przez Ciebie połączenie z PHP Framework, już nie działa: "UWAGA: Ta nazwa domeny wygasła w dniu 29.10.2017 i oczekuje na odnowienie lub usunięcie." – Peter

-4

Chciałbym użyć ramy, takie jak CodeIgniter. Nie potrzebujesz katalogu dla każdej części adresu URL, wystarczy użyć pliku .htaccess, aby przekierować wszystkie adresy URL do określonego adresu URL i mieć adres URL wszystkich działań.

+0

To jest właśnie to, co tutaj robię. Używam pliku .htaccess, aby wskazać wspomniany plik api.php. Następnie używa logiki, aby zdecydować, gdzie wysłać użytkownika. – PHPGuru

5

To działało dla mnie: Umieść to w pliku htaccess w katalogu głównym swojej witryny.

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L] 
RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L] 
</IfModule> 

A potem, jeśli przejdziesz do strony http://localhost/api/person/susan Zobaczysz, że można dostać się do pliku na http://localhost/api/api.php Mam też stronę przepis, że idę do korzystania http://localhost/recipe/edit/2 Umieścić to w api.php plik:

<?php 
$requestParts = explode('/',$_GET['request']); 
$category = $requestParts[0]; 
$action = $requestParts[1]; 
$data = $requestParts[2]; 
if($category == 'recipe'){ 
    include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php'); 
} 

zmienne powyżej odbędzie kategorię: przepis, działanie: dodawać lub edytować, a dane, które mogą być liczbą, która jest identyfikator receptury lub co kiedykolwiek chcesz go mieć. Następnie w add_recipe.php użyj zmiennych, aby określić, czy edytujesz lub dodajesz przepis. A jeśli używasz api, możesz dołączyć różne pliki w zależności od tego, z jakiej prośby ajax korzystasz, aby porozmawiać z twoim interfejsem API.

Powiązane problemy