2010-03-06 42 views
5

Tôi đã đọc rất nhiều hướng dẫn Restful cho PHP.có nghĩa là chỉ dành cho các dịch vụ web HOẶC cho cả dịch vụ web VÀ các trang web?

(Tôi không muốn đi sâu vào lý do tại sao tôi không sử dụng RoR. Đó là do nhóm nghiên cứu là quen thuộc hơn với PHP)

Bởi vì chúng tôi đang có kế hoạch mở rộng trong tương lai vào có API tôi đọc điều quan trọng là triển khai các dịch vụ web Restful.

tôi đã xem xét hướng dẫn như

http://www.gen-x-design.com/archives/create-a-rest-api-with-php/

Rõ ràng yên tĩnh có nghĩa là cho webservices.

Còn về trang web thì sao? họ cũng có thể được RESTFUL?

nếu câu trả lời là KHÔNG, vui lòng không vượt quá dòng này VÀ chỉ cho tôi biết. Cảm ơn bạn.

tôi biết làm cho các url trông giống như các url RESTFUL là chỉ cần sử dụng mod_rewrite. Tuy nhiên, tôi khá chắc chắn, kiến ​​trúc yên tĩnh đi xa hơn chỉ làm cho các url trông đẹp.

Ví dụ: tôi có danh sách các mục trên trang web có tên là list.php. Mỗi mục có một liên kết xóa bên cạnh nó. Ví dụ: list.php? Id = 1 & deleteitem

Điều gì xảy ra là khi ai đó nhấp vào liên kết list.php? Id = 1 & deleteitem, tất nhiên tôi quay trở lại cùng một tệp list.php và kiểm tra deleteitem param trong $ _GET.

Nếu được phát hiện, tôi sẽ xóa khỏi cơ sở dữ liệu dựa trên id thông số trong $ _GET.

Sau đó tôi sẽ chuyển hướng trở lại list.php KHÔNG CÓ bất kỳ thông số nào.

Tôi tự hỏi, làm thế nào để tôi thực hiện toàn bộ dòng này RESTFUL?

Tôi hỏi vì trong REST, để xóa nội dung bạn cần sử dụng phương thức yêu cầu HTTP (DELETE).

Rõ ràng trong các liên kết của tôi họ là tất cả chỉ đơn giản là <a href="list.php?id=1&deleteitem">Delete</a>

hãy soi sáng cho tôi.

Lập trình của tôi không mạnh mẽ và sẽ tốt nếu lời khuyên được đưa ra có thể là giáo dân càng tốt.

Cảm ơn bạn.

EDIT

Tôi có 2 câu hỏi tiếp theo.

câu hỏi 1) Vì đây là danh sách các mục có phân trang, URL trông như thế nào nếu tôi muốn đặt chế độ này là RESTful?

câu hỏi 2) Kể từ khi tôi đang đưa DELETE liên kết bên cạnh mỗi một trong các mục trong danh sách, tôi hiểu bây giờ, tôi nên sử dụng

<form method="POST"> 
<input type=hidden name="_method" value="delete"> 
<input type="submit" > 
</form> 

để thay thế.

tuy nhiên biểu mẫu sẽ được đăng ở đâu? url mục?/items/{item-id}

Nhưng tôi muốn quay lại trang danh sách này hiển thị thông báo thành công SAU KHI xóa thành công hàng trong cơ sở dữ liệu.

Tôi cũng muốn tránh thông báo bật lên khi tôi làm mới trang danh sách này bằng thông báo thành công.

Nếu tôi đăng lại url list.php này, thì nó không phải là RESTful yes? bởi vì tôi được kể bởi các câu trả lời bên dưới rằng mỗi mục là một tài nguyên cần url riêng của nó.

Hãy khai sáng cho tôi. Cảm ơn bạn.

Trả lời

6

RESTful thường được sử dụng khi đề cập đến các dịch vụ web, nhưng nó có thể áp dụng rất tốt cho các trang web. Tóm lại, là RESTful là về xử lý các tài nguyên. Một tài nguyên có thể là một người, một cuốn sách, một bộ phim, một nhà hát, một vé, hoặc bất cứ điều gì bạn ưa thích.

Có bốn thao tác cơ bản mà bạn có thể thực hiện trên tài nguyên.

  • tạo (POST)
  • đọc (GET)
  • cập nhật (PUT)
  • xóa (DELETE)

Hầu hết các trình duyệt web không hỗ trợ các hành động PUTDELETE, vì vậy bạn chỉ có thể sử dụng các tác vụ POST để gửi dữ liệu. Rails giả mạo PUT và DELETE bằng cách chuyển vào một tham số ẩn có tên là _method rằng khung công tác chọn lên và định tuyến nó tùy thuộc vào giá trị đó.

Ngoài ra, bạn không bao giờ nên sử dụng GET cho bất kỳ hành động phá hoại nào. Bất kỳ hành động nào thay đổi trạng thái (các) tài nguyên của bạn, phải được gọi với POST, PUT hoặc DELETE tùy thuộc vào thay đổi (PUT/DELETE giả với POST nếu cần).

Tôi khuyên bạn nên kiểm tra cách định tuyến RESTful được xử lý trong Rails chỉ để có ý tưởng, nếu không có gì khác. Mặc dù bốn hành động trên là đủ để sửa đổi tài nguyên theo bất kỳ cách nào có thể, Rails cũng giới thiệu ba loại hành động khác có vẻ hữu ích.

  • index (liệt kê quan điểm của tất cả các mục)
  • mới (thường là một cái nhìn hình thức để thêm một tài nguyên mới )
  • chỉnh sửa (thường là một cái nhìn hình thức để cập nhật một nguồn tài nguyên hiện có)

Khá URL chắc chắn là trên bàn khi thiết kế các trang web RESTful, nhưng có lẽ chiến thắng lớn nhất là chất lượng của mã được cải thiện tự động. Khi bạn chỉ xử lý tài nguyên và chỉ có bốn hành động tiềm năng có thể được áp dụng cho tài nguyên, thì mọi thứ bắt đầu tự làm sạch.

Sửa 1: Tự mô tả URL được ưa thích và sẽ làm cho cuộc sống của bạn dễ dàng hơn, nhưng có gì ngăn cản từ việc tạo URL khó hiểu mà nhận ra duy nhất một nguồn tài nguyên và quản lý nó bằng cách sử dụng động từ HTTP là. Các URL như dưới đây (sử dụng md5) để nhận dạng duy nhất các tài nguyên hoàn toàn là RESTful.

// represents a person "John Doe" 
http://example.com/4c2a904bafba06591225113ad17b5cec 

// represents the movie "Lord of the Rings: The Two Towers" 
http://example.com/1d9198260dec7bda3fb21e232d60fec3 

// represents the "Formula One" sport 
http://example.com/fs340as?id=23xa12&type=SP012Ts 

Đó là trạng thái chuyển đổi trạng thái hoàn toàn ngay tại đó. Băm MD5 giống như địa chỉ gửi thư của tài nguyên vẫn không đổi. Biểu diễn có thể là chi tiết của phim (trong html/xml/json/etc.), Hoặc có thể là video của chính bộ phim tùy thuộc vào khả năng của máy khách).

Chỉnh sửa 2: Giả sử bạn có tài nguyên là bộ sưu tập - countries của thế giới. Nó có thể được đại diện bởi một URI và HTTP động từ như:

GET /countries 

Kể từ phân trang là một tài sản của ứng dụng chứ không phải là nguồn lực bản thân, bạn có thể cung cấp các thông số chuỗi truy vấn để kiểm soát nó.

GET /countries?page=1 

Một quốc gia cũng là tài nguyên là một phần của tài nguyên quốc gia. Bạn có thể xác định một quốc gia với một URL như:

/countries/<id> 

Và hoạt động trên đất nước này có thể được thực hiện với những động từ:

GET /countries/<id> 
POST /countries -- the new country has no existing representation 
PUT /countries/<id> 
DELETE /countries/<id> 
+0

Tôi có một câu hỏi. Đối với các biểu mẫu sử dụng POST, tôi không muốn người dùng của tôi nhìn thấy cửa sổ bật lên khi họ sử dụng các nút quay lại và làm mới trên trình duyệt của họ. Vì vậy, làm thế nào để tôi vượt qua điều này trong khi vẫn còn được RESTful? –

+1

kiểm tra câu hỏi này để biết các ý tưởng về cách khắc phục điều đó: http://stackoverflow.com/questions/660329/prevent-back-button-from-showing-post-confirmation-alert – Anurag

+0

Tôi có câu hỏi về chế độ xem danh sách của tất cả mặt hàng. Tôi không quen thuộc với Rails, vì vậy tôi phải hỏi bạn. Để phân trang danh sách, một khung làm việc RESTful sẽ xử lý nó như thế nào? –

1

Cách tiếp cận an toàn chắc chắn có thể được sử dụng trong các trang web. Đặt các lệnh trong một URL không phải là một ý tưởng hay, do các tác dụng phụ mà bạn đang đề cập đến. Khi bạn thay đổi cơ sở dữ liệu (hoặc làm bất cứ điều gì thay đổi mô hình), sử dụng lệnh POST.

Tất nhiên, bạn không có PUT và delte trong các trình duyệt web lớn, nhưng bạn luôn có thể gửi một POST đơn giản với một số thông số cụ thể như method = "PUT", method = "DELETE" vv

+0

Tôi muốn gọi phương thức tham số = PUT hoặc method = DELETE: D – aefxx

+0

aefxx: ý tưởng hay, tất nhiên "phương thức" có ý nghĩa hơn "công việc" – naivists

+0

Tôi có một câu hỏi. Đối với các biểu mẫu sử dụng POST, tôi không muốn người dùng của tôi nhìn thấy cửa sổ bật lên khi họ sử dụng các nút quay lại và làm mới trên trình duyệt của họ. Vì vậy, làm thế nào để tôi vượt qua điều này trong khi vẫn còn được RESTful? –

2

Câu trả lời dài ngắn: có. REST là dành cho cả hai. Đó là bởi vì ngay cả khi bạn có đơn giản nhất của tất cả các trang web người ta vẫn sẽ phải GET trang của bạn và có thể POST những dữ liệu cá nhân để thêm một mục vào lưu bút. Trong đó tất cả chúng ta đều tuân thủ REST bằng cách nào đó.

Trong trường hợp của bạn, việc triển khai trình duyệt kém khiến bạn khó có thể thực hiện một cách PHỤC HỒI TUYỆT VỜI. DELETE không được hỗ trợ mà không có Javascript và do đó bạn sẽ phải sử dụng GET hoặc POST (cả hai đều có ý nghĩa hoàn toàn khác với DELETE trong REST).

1

Tôi đã viết một khuôn khổ nhỏ trên đầu trang của Zend Framework để làm cho việc thực hiện giao diện RESTful dễ dàng hơn:

http://github.com/mikekelly/Resauce

Bạn có thể sử dụng cho các dịch vụ web và các trang web. Về cơ bản, một trang web chỉ là một dịch vụ web được điều khiển bởi HTML.

+0

Do một số lý do nhất định, chúng tôi không sử dụng Zend Framework. Tôi vẫn có thể sử dụng Resauce để giúp tôi trong trường hợp của tôi như mô tả ở trên? Cảm ơn bạn. –

+0

Resauce được xây dựng từ các thành phần MVC của ZF - vì vậy không. Có các dự án khác như keo (http://gluephp.com/about), Limonade, vv – Mike

1

RESTful có nghĩa là không phải là "URI đẹp". Mặc dù thực tế là các URI xác định một tài nguyên mà điều duy nhất REST nói về URI là, chúng không nên chứa một tham số hành động như "xóa".

Trong trường hợp của bạn, bạn sẽ gọi

DELETE /items/6793 

câu trả lời sẽ là thường tình trạng đang 200 OK với danh sách được sửa đổi như nội dung thư.Xem: http://restpatterns.org/HTTP_Methods/DELETE

Vì HTML 4 không hỗ trợ các tác vụ biểu mẫu khác hơn GET và POST, bạn phải giải quyết sự cố với thông số ẩn và ghi đè phương thức HTTP ở phía máy chủ.

+0

ngay cả khi tôi sử dụng biểu mẫu POST để xóa mục, làm cách nào tôi chuyển hướng trở lại trang danh sách?Tôi đã chỉnh sửa câu hỏi của mình để bao gồm truy vấn này –

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