2011-11-28 58 views
31

"URL sạch" còn được gọi là "URL RESTful" thân thiện với người dùng, hoàn toàn là cấu trúc và không chứa chuỗi truy vấn. Thay vào đó chúng chỉ chứa đường dẫn của tài nguyên.Sử dụng URL sạch trong RESTful API

ví dụ: "http://twitter.com/users/show/"+username+".json"

Các câu hỏi về chức năng server-side:

  1. Tôi có cần phải tạo một kịch bản API phía máy chủ duy nhất cho mỗi thư mục?

  2. Tôi có thể chuyển tiếp tất cả yêu cầu tới một tập lệnh không nếu vậy làm cách nào để lấy thông tin hữu ích từ cấu trúc URL sạch ($ _GET ['url_structure'])?

  3. Tại sao cuộc gọi twitter đến tệp .json chắc chắn không tồn tại. Nó phải được tạo ra theo yêu cầu. Cách hoạt động của ? Điều này khiến tôi tin rằng câu trả lời cho câu hỏi 2 là có.

+1

Các url sạch sẽ không liên quan gì đến REST apis. Chúng chỉ là một cách hay để tạo các url mà nếu không có các chuỗi truy vấn xấu. Họ thường được thực hiện bằng cách sử dụng mod_rewrite để có các url sạch và nội bộ transmogrify nó trở lại một phiên bản chuỗi truy vấn. –

Trả lời

53

1) Không nếu bạn sử dụng một khuôn khổ RESTful như RecessPHP hoặc nếu bạn sử dụng một quy tắc mod_rewrite trong tập tin .htaccess bạn để chuyển hướng tất cả các yêu cầu API vào một tập tin PHP duy nhất (gọi là bộ điều khiển phía trước).

.htaccess

RewriteEngine On 
RewriteRule ^/api/ api.php 

api.php

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

2) Bạn có thể sử dụng các module viết lại của apache để chuyển hướng tất cả các yêu cầu api đến một đặc biệt Tệp PHP xử lý chúng. Tùy thuộc vào cấu hình apache của bạn, url được yêu cầu ban đầu (RESTful) sẽ được lưu trữ trong biến máy chủ trong PHP, tôi tin rằng đó là $_SERVER['REQUEST_URI']. Tất nhiên bạn cũng có thể chuyển một biến số $_GET[] sang PHP có chứa địa chỉ RESTful.

.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 (và nhiều API khác) sử dụng điều này bởi vì nó là một cách thuận tiện để cung cấp định dạng mà ứng dụng mong đợi từ API. Tất cả các yêu cầu API được định tuyến lại tới một tệp PHP duy nhất xử lý việc tạo tất cả các tệp và lặp lại nội dung của chúng tới đầu ra. Các tập tin là không bao giờ thực sự được lưu trữ trên máy chủ (trừ khi nó được lưu trữ).


Tài Tốt


Một lưu ý o n RecessPHP. Nó chắc chắn là một công cụ tuyệt vời và tôi sẽ khuyến khích bạn xem xét nó (có thể ở nguồn của nó để có được một ý tưởng về cách nó xử lý mọi thứ), nhưng điều đó nói rằng, nó có vẻ hơi clunky với tôi. Thực tế là tên đường dẫn được viết trong các nhận xét đặc biệt có vẻ rất không phải PHP đối với tôi. Tôi sẽ đi lạc khỏi điều này, và tôi sẽ không gọi nó là khung hoàn hảo, nhưng nó chắc chắn là một sự khởi đầu. Chúc may mắn!

+2

Cảm ơn phản hồi tuyệt vời mà bạn đã thực sự đề cập đến. Tôi thường đi lạc khỏi các khuôn khổ trừ khi nó tiết kiệm cho tôi rất nhiều thời gian. Nhưng tôi chắc chắn sẽ kiểm tra Recess. –

+0

Tôi cũng đang tìm kiếm các mẹo về việc triển khai phía máy chủ của các URL RESTful. Tôi đã nghi ngờ Front Controller có liên quan nên cảm ơn vì sự rõ ràng. Đây là một câu trả lời tuyệt vời. – ComethTheNerd

+0

@Bailey Parker :: Liên kết tới khung công tác PHP giải lao mà bạn đã cung cấp, không hoạt động nữa: "THÔNG BÁO: Tên miền này hết hạn vào ngày 29/11/2017 và đang chờ gia hạn hoặc xóa". – Peter

-4

Tôi muốn sử dụng một khung như CodeIgniter. Bạn không cần thư mục cho từng phần của URL, bạn chỉ cần sử dụng tệp .htaccess để chuyển hướng tất cả các url đến một url cụ thể và có giao dịch url đó với tất cả các tác vụ.

+0

Đó là khá nhiều những gì tôi đang làm ở đây. Tôi sử dụng tệp .htaccess để trỏ tới tệp api.php được đề cập. Sau đó, sử dụng logic để quyết định nơi để gửi cho người dùng. – PHPGuru

5

Điều này làm việc cho tôi: Đặt điều này trong tệp htaccess tại thư mục gốc của trang web của bạn.

<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> 

Và sau đó nếu bạn đi đến trang http://localhost/api/person/susan Bạn sẽ thấy rằng nó sẽ đưa bạn đến các tập tin tại http://localhost/api/api.php Tôi cũng có một trang công thức mà tôi đi đến sử dụng http://localhost/recipe/edit/2 Đặt này trong api.php file:

<?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'); 
} 

các biến trên sẽ giữ mục: công thức, hành động: thêm hoặc chỉnh sửa, và các dữ liệu đó có thể là một số trong đó là id cho các công thức hoặc những gì đã bao giờ bạn muốn nó được. Sau đó, bên trong add_recipe.php sử dụng các biến để xác định xem bạn đang chỉnh sửa hay thêm một công thức. Và nếu bạn sử dụng api bạn có thể bao gồm các tệp khác nhau tùy thuộc vào yêu cầu ajax bạn đang sử dụng để nói chuyện với api của bạn.

Các vấn đề liên quan