2010-04-09 25 views
25

Tôi đã đọc trên REST, và tôi đang cố gắng tìm ra những lợi thế để sử dụng nó. Cụ thể, lợi thế của các URL kiểu REST làm cho chúng có giá trị thực hiện trên một yêu cầu GET điển hình hơn với một chuỗi truy vấn là gì?Điều gì đang sử dụng URL RESTful mua cho tôi?

Tại sao URL này:

http://www.parts-depot.com/parts/getPart?id=00345 

coi thua kém này?

http://www.parts-depot.com/parts/00345 

Trong ví dụ trên (lấy từ here) URL thứ hai thực sự trông thanh lịch và ngắn gọn hơn. Nhưng nó có chi phí ... URL đầu tiên là khá dễ dàng để thực hiện trong bất kỳ ngôn ngữ web, ra khỏi hộp. Thứ hai yêu cầu mã bổ sung và/hoặc cấu hình máy chủ để phân tích các giá trị, cũng như tài liệu bổ sung và thời gian dành giải thích hệ thống cho các lập trình viên cơ sở và biện minh cho các đồng nghiệp. Vì vậy, câu hỏi của tôi là, ngoài niềm vui của việc có URL trông thật tuyệt, những lợi ích mà các URL RESTful giành được cho tôi mà sẽ làm cho việc sử dụng chúng đáng giá chi phí thực hiện?

+0

Chỉ cần tò mò: ngôn ngữ nào yêu cầu mã và/hoặc cấu hình bổ sung để triển khai URL sau? – Ken

+0

Tôi đã suy nghĩ cụ thể về các servlet Java. Việc triển khai vani thuần túy của URL thứ hai sẽ liên quan đến việc gọi request.getURL(), tách đường dẫn URL thành mã thông báo và thực hiện điều gì đó với mã thông báo. Đây không phải là một tấn công việc, nhưng nó không phải là sạch như gọi request.getParameter ("parameterName"). Ngoài ra, bạn có thể giữ request.getParameter() và có lớp máy chủ web viết lại URL thứ hai giống như lần đầu tiên sử dụng cấu hình ghi đè ... có vẻ như đó là cách để đi nếu bạn phải cập nhật một loạt các dịch vụ hiện có theo kiểu URL mới. –

Trả lời

12

Hy vọng là nếu bạn tạo URL của bạn tham khảo một danh từ thì có một cơ hội tốt hơn mà bạn sẽ thực hiện các động từ HTTP một cách chính xác. Ngoài ra, hoàn toàn không có lợi thế của một URL so với URL khác.

Thực tế là nội dung của URL hoàn toàn không liên quan đến hệ thống RESTful. Nó chỉ đơn giản là một định danh.

Nó không phải là những gì nó trông giống như, đó là những gì bạn làm với nó đó là quan trọng.

4

Một thứ mà tôi luôn thích là người dùng web hiểu biết, nhưng chắc chắn không nên được sử dụng làm nguyên tắc hướng dẫn khi sử dụng lược đồ URL đó là các loại URL đó là "có thể hack". Đặc biệt đối với những thứ như blog nơi tôi có thể chỉnh sửa ngày hoặc số trang trong URL thay vì phải tìm nút "trang tiếp theo" ở đâu.

+1

Tất cả các URL đều có thể tấn công. Nếu bạn dựa vào những người không đoán URL của bạn như một loại cơ chế bảo mật, bạn đang làm sai và lược đồ URL là ít nhất trong số các vấn đề của bạn. – meagar

+1

Tôi nghĩ Daniel có ý nghĩa như thế này hơn là điều hướng giao diện người dùng cồng kềnh, cồng kềnh của bạn, anh ấy có thể tìm kiếm nội dung bằng cách sửa đổi URL. Đó chắc chắn là một lý do * Tôi * thích các URL RESTful hơn. – notJim

+1

@notJim Đó chính là điều tôi muốn nói. Nếu điều khiển pagination của bạn hút, nó không quan trọng đối với tôi nếu tôi có thể biến 'http: // foo.com/article-name/page/1' thành' http://foo.com/article-name/ Trang/2' dễ dàng thay vì có, giả sử 'http: //foo.com/display_article.php? item = 412551' –

6

Một cách nhìn REST:

http://tomayko.com/writings/rest-to-my-wife (mà hiện đã được đưa xuống, buồn bã, nhưng vẫn có thể được nhìn thấy trên web.archive.org)

Vì vậy, dù sao, HTTP này giao thức Fielding và những người bạn của anh ấy tạo ra — là tất cả về việc áp dụng động từ vào danh từ. Ví dụ: khi bạn truy cập trang web, trình duyệt thực hiện HTTP GET trên URL mà bạn nhập vào và quay lại có trang web.

...

Thay vào đó, phần lớn đang bận rộn lớp bằng văn bản về phức tạp thông số kỹ thuật để thực hiện công cụ này trong một cách khác đó là gần như không hữu ích hoặc hùng hồn. Danh từ không phải là phổ quát và động từ không phải là đa hình. Chúng tôi đang loại bỏ thập kỷ sử dụng thực tế và đã được chứng minh kỹ thuật và bắt đầu lại với một cái gì đó trông rất giống với các hệ thống khác không thành công trong quá khứ. Chúng tôi đang sử dụng HTTP nhưng chỉ vì nó giúp chúng tôi trao đổi với mạng của chúng tôi và số an ninh ít hơn . Chúng tôi đang giao dịch sự đơn giản cho các công cụ hào nhoáng và trình thuật sĩ.

5

Một điều nhảy ra ngoài với tôi (câu hỏi hay ho) là những gì họ mô tả. Đầu tiên mô tả một hoạt động (getPart), phần thứ hai mô tả một tài nguyên (phần 00345).

Ngoài ra, có thể bạn không thể sử dụng các động từ HTTP khác với phương thức đầu tiên - ví dụ: bạn cần một phương thức mới cho putPart.Thứ hai có thể được tái sử dụng với các động từ khác nhau (như PUT, DELETE, POST) để 'thao tác' tài nguyên? Tôi cho rằng bạn cũng kinda nói GET hai lần - một lần với động từ, một lần nữa trong phương pháp, do đó, thứ hai là phù hợp hơn với ý định của giao thức HTTP?

+3

Ngụ ý trong câu trả lời này là REST không chỉ có URL đẹp. Đó là về việc sử dụng giao thức HTTP theo cách nó được thiết kế để sử dụng, tức là áp dụng các động từ/phương thức lô-gic vào danh từ/tài nguyên/URL. –

0

"Thứ hai đòi hỏi thêm đang và/hoặc cấu hình máy chủ để phân tích ra giá trị,"

Thật sao? Bạn chọn một khung làm việc nghèo nàn. Kinh nghiệm của tôi là phiên bản RESTful chính xác là cùng một lượng mã. Có lẽ tôi chỉ may mắn vào một khuôn khổ tuyệt vời.

"cũng như thêm tài liệu và thời gian dành cho việc giải thích hệ thống để các lập trình viên cơ sở"

Chỉ một lần. Sau khi họ nhận được nó, bạn không cần phải giải thích nó một lần nữa.

"và biện minh cho đồng nghiệp".

Chỉ một lần. Sau khi họ nhận được nó, bạn không cần phải giải thích nó một lần nữa.

+0

đây là những nhận xét hay và tôi đồng ý với bạn. Nhưng tôi nghĩ bạn không thực sự trả lời câu hỏi. "câu hỏi của tôi là, ngoài niềm vui của việc có URL trông tuyệt vời, những lợi ích nào mà URL RESTful giành được cho tôi mà sẽ làm cho việc sử dụng chúng đáng giá chi phí thực hiện?" –

+0

@Diego Das: "Câu hỏi" không hợp lý. Không có chi phí thực hiện. Tiền đề cơ bản là ba thứ dường như là những lời phàn nàn vô căn cứ. –

+0

Mọi thứ đều có chi phí. Đào tạo tài liệu hướng dẫn về cách triển khai tính năng này trong mỗi khung công tác mà chúng tôi sử dụng thời gian. Nếu tôi phải dạy cho 10 nhà phát triển các phương pháp tôi đã học được, và cuộc họp đó kéo dài 30 phút, thì chi phí cho công ty của tôi là 500 đô la. Nếu tôi phải thuyết phục các đồng nghiệp hoài nghi làm một điều gì đó theo cách mới lạ, thay vì những gì đã cố gắng và thực sự, điều đó khiến tôi tốn tiền chính trị. Trước khi tôi đi qua tất cả những điều đó, tôi muốn biết nếu và tại sao thay đổi này là giá trị nó. –

2

Ưu điểm lớn nhất của REST IMO là nó cho phép một cách sạch sẽ để sử dụng các động từ HTTP (đó là quan trọng nhất trên các dịch vụ REST). Trên thực tế, sử dụng REST có nghĩa là bạn đang sử dụng giao thức HTTP và các động từ của nó.

Sử dụng url của bạn, và tưởng tượng bạn muốn gửi một "phần", thay vì nhận được nó

Trường hợp đầu tiên nên là như thế này:

Bạn đang sử dụng một GET nơi bạn nên đã sử dụng một bài

http://www.parts-depot.com/parts/postPart?param1=lalala&param2=lelele&param3=lilili 

trong khi trên một bối cảnh REST, nó phải được

http://www.parts-depot.com/parts 

một thứ trên cơ thể, (ví dụ) một xml như thế này

<part> 
    <param1>lalala<param1> 
    <param2>lelele<param1> 
    <param3>lilili<param1> 
</part> 
+0

Tôi nghĩ đây là giải thích tốt nhất cho đến nay, mặc dù tôi vẫn chưa tin rằng phong cách URL RESTful đang sửa chữa một thứ gì đó đã bị hỏng. Vẫn hoàn toàn có thể sử dụng GET và POST trên cùng một URL, bất kể bạn có sử dụng truy vấn sting trong yêu cầu GET hay không nếu bạn lưu trữ dữ liệu đó trong URL. Tại sao giải pháp đó không được sử dụng để ủng hộ các URL RESTful? Liệu nó có thực sự chỉ làm lu mờ các URL “sạch” để có lợi ích cho chính mình không? Hoặc là có một cái gì đó tôi có thể làm với các URL REST mà chỉ sẽ không làm việc theo một mô hình Yêu cầu HTTP cũ Plain? –

+0

Như tôi đã nói về câu trả lời (có thể tôi không đủ rõ ràng), REST dự định sử dụng các động từ HTTP khi chúng được thiết kế để ... Bạn có thể làm bất cứ điều gì với GET/POST. Tuy nhiên, làm thế nào bạn nên cập nhật một nguồn tài nguyên mà là idempotent mà không có ĐỘNG TỪ PUT? Bạn có thể làm điều đó bằng cách sử dụng một POST và thậm chí là một GET, nhưng nếu có một động từ trên giao thức HTTP để làm điều này, tại sao không sử dụng nó? Nó phải sạch hơn, dễ hiểu hơn và vì bạn sẽ sử dụng giao thức này, sử dụng nó như giao thức chính nó sẽ mong đợi ... :) –

+0

Không có điều gì như là một URL REST. – SerialSeb

1

Ngữ nghĩa URI được xác định bởi RFC 2396. Các chất chiết xuất đặc biệt thích hợp cho câu hỏi này là 3.3. "Path Component":

Các thành phần đường dẫn chứa dữ liệu, cụ thể cho cơ quan (hoặc chương trình nếu không có thành phần chính quyền), xác định các nguồn trong phạm vi mà chương trình và thẩm quyền.

Và 3.4 "Query Component":

Thành phần truy vấn là một chuỗi các thông tin để được giải thích bởi tài nguyên.

Lưu ý rằng thành phần truy vấn không phải là một phần của mã định danh tài nguyên, nó chỉ là thông tin được giải thích bởi tài nguyên.

Như vậy, tài nguyên được xác định bằng ví dụ đầu tiên của bạn thực sự chỉ là /parts/getPart. Nếu bạn có ý định là URL phải xác định một phần tài nguyên cụ thể thì ví dụ đầu tiên không làm điều đó, trong khi ví dụ thứ hai (/parts/00345) thì không.

Vì vậy, 'lợi thế' của phong cách thứ hai của URL là nó có ngữ nghĩa chính xác, trong khi cái đầu tiên thì không.

+0

Đó là một câu nói hấp dẫn. Tôi sẽ phải đào sâu vào điều đó nhiều hơn như tôi đã thấy Roy đưa ra những phát biểu vào một vài trường hợp dường như mâu thuẫn trực tiếp với điều đó. –

+2

Kiểm tra RFC3986 thay thế cho RFC2396 http://labs.apache.org/webarch/uri/rfc/rfc3986.html#query. Trong phần Truy vấn 3.4 có trích dẫn sau * Thành phần truy vấn chứa dữ liệu không phân cấp, cùng với dữ liệu trong thành phần đường dẫn, phục vụ để xác định tài nguyên trong phạm vi lược đồ của URI * –

+0

Hmmm thú vị ... Tôi đã có 't nhận ra rằng ngữ nghĩa đã được thay đổi bởi RFC cập nhật. Tôi đã đọc những năm trước đây; Tôi chỉ cho rằng bản cập nhật sẽ không làm thay đổi ngữ nghĩa một cách đáng kể. Điều đó sẽ dạy tôi đứng sau thời đại. OK như vậy vào năm 2004 câu trả lời này sẽ đúng, nhưng bây giờ nó sai: -S –

0

Không sử dụng các phần truy vấn/tìm kiếm trong URL không phải là truy vấn hoặc tìm kiếm, nếu bạn làm điều đó - theo thông số URL - bạn có thể ngụ ý điều gì đó về tài nguyên mà bạn không thực sự muốn.

Sử dụng các phần truy vấn cho các tài nguyên là tập con của một số tài nguyên lớn hơn - phân trang là một ví dụ tốt về nơi áp dụng điều này.

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