Chính xác thì lập trình RESTful là gì?


3983

Chính xác thì lập trình RESTful là gì?


3
xem thêm câu trả lời tại liên kết stackoverflow.com/a/37683965/3762855
Ciro Corvino

3
REST có thể đã già đi một chút bây giờ;) youtu.be/WQLzZf34FJ8
Vlady Veselinov

1
Ngoài ra, hãy tham khảo liên kết này để biết thêm thông tin tin tức.ycombinator.com / item? Id = 3538585
Ashraf.Shk786


5
@ OLIVER.KOO quan sát tốt đẹp. Chỉ là tôi đã hỏi nó vào thời điểm nó là một thứ mới. Nó đã bị ném xung quanh rất nhiều nhưng không nhiều người biết nó là về cái gì. Ít nhất là tôi đã không làm, và dường như tôi hỏi điều này đã giúp họ vì họ cũng muốn biết.
hasen

Câu trả lời:


743

Một kiểu kiến ​​trúc được gọi là REST (Chuyển giao trạng thái đại diện) ủng hộ rằng các ứng dụng web nên sử dụng HTTP như ban đầu được hình dung . Tra cứu nên sử dụng GETyêu cầu. PUT, POSTDELETEcác yêu cầu nên được sử dụng cho đột biến, tạo và xóa tương ứng .

Những người đề xuất REST có xu hướng ủng hộ các URL, chẳng hạn như

http://myserver.com/catalog/item/1729

nhưng kiến ​​trúc REST không yêu cầu những "URL đẹp" này. Một yêu cầu GET với một tham số

http://myserver.com/catalog?item=1729

là mỗi bit như RESTful.

Hãy nhớ rằng không bao giờ nên sử dụng các yêu cầu GET để cập nhật thông tin. Ví dụ: yêu cầu GET để thêm một mục vào giỏ hàng

http://myserver.com/addToCart?cart=314159&item=1729

sẽ không thích hợp Yêu cầu GET nên idempotent . Đó là, phát hành một yêu cầu hai lần sẽ không khác gì phát hành một lần. Đó là những gì làm cho các yêu cầu được lưu trữ. Yêu cầu "thêm vào giỏ hàng" không phải là idempotent, ban hành hai lần thêm hai bản sao của mục vào giỏ hàng. Một yêu cầu POST rõ ràng thích hợp trong bối cảnh này. Do đó, ngay cả một ứng dụng web RESTful cũng cần chia sẻ các yêu cầu POST.

Điều này được lấy từ cuốn sách tuyệt vời Core JavaServer phải đối mặt với cuốn sách của David M. Geary.


2
Làm mất hoạt động Idempotent có sẵn: GET (An toàn), PUT & DELETE (Ngoại lệ được đề cập trong liên kết này restapitutorial.com/lessons/idempotency.html). Tài liệu tham khảo bổ sung cho các phương pháp an toàn & bình thường w3.org/Prot Protocol / rfc2616 / rfc2616
Abhijeet

5
a) điểm quan trọng về GET là sự an toàn, không phải là sự bình tĩnh, b) @Abhijeet: RFC 2616 đã bị lỗi thời vào năm 2014; xem RF 7230ff.
Julian Reschke

12
Cái này sai. Đọc phần này để hiểu chính xác về REST roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven hoặc stackoverflow.com/questions/19843480/ từ
kushalvm

4
@kushalvm Định nghĩa học thuật về REST không được sử dụng trong thực tế.
Tinh tinh hiếu chiến

3
Thực tế, chúng ta có thể tự hỏi liệu một khái niệm có hoạt động hay không vì chúng ta không đơn giản cung cấp cho nó một định nghĩa ổn định và dễ hiểu cho tất cả
HoCo_

2918

REST là nguyên tắc kiến ​​trúc cơ bản của web. Điều tuyệt vời về web là thực tế rằng máy khách (trình duyệt) và máy chủ có thể tương tác theo những cách phức tạp mà không cần khách hàng biết trước về máy chủ và tài nguyên mà nó lưu trữ. Hạn chế chính là cả máy chủ và máy khách đều phải đồng ý về phương tiện được sử dụng, trong trường hợp web là HTML .

Một API tuân thủ các nguyên tắc của REST không yêu cầu khách hàng biết bất cứ điều gì về cấu trúc của API. Thay vào đó, máy chủ cần cung cấp bất kỳ thông tin nào khách hàng cần để tương tác với dịch vụ. Biểu mẫu HTML là một ví dụ về điều này: Máy chủ chỉ định vị trí của tài nguyên và các trường bắt buộc. Trình duyệt không biết trước nơi gửi thông tin và không biết trước thông tin nào cần gửi. Cả hai dạng thông tin đều được cung cấp hoàn toàn bởi máy chủ. (Nguyên tắc này được gọi là HATEOAS : Hypermedia là động cơ của trạng thái ứng dụng .)

Vì vậy, làm thế nào điều này áp dụng cho HTTP và làm thế nào nó có thể được thực hiện trong thực tế? HTTP được định hướng xung quanh các động từ và tài nguyên. Hai động từ trong cách sử dụng chính là GETPOST, mà tôi nghĩ mọi người sẽ nhận ra. Tuy nhiên, tiêu chuẩn HTTP định nghĩa một số khác như PUTDELETE. Những động từ này sau đó được áp dụng cho các tài nguyên, theo các hướng dẫn được cung cấp bởi máy chủ.

Ví dụ: Hãy tưởng tượng rằng chúng ta có cơ sở dữ liệu người dùng được quản lý bởi một dịch vụ web. Dịch vụ của chúng tôi sử dụng một hypermedia tùy chỉnh dựa trên JSON, mà chúng tôi chỉ định mô phỏng application/json+userdb(Cũng có thể có application/xml+userdbapplication/whatever+userdb- nhiều loại phương tiện có thể được hỗ trợ). Cả máy khách và máy chủ đều được lập trình để hiểu định dạng này, nhưng chúng không biết gì về nhau. Như Roy Fielding chỉ ra:

API REST nên dành hầu hết tất cả nỗ lực mô tả của nó để xác định (các) loại phương tiện được sử dụng để thể hiện tài nguyên và trạng thái ứng dụng lái xe hoặc trong việc xác định tên quan hệ mở rộng và / hoặc đánh dấu siêu văn bản cho các loại phương tiện tiêu chuẩn hiện có.

Một yêu cầu cho tài nguyên cơ sở /có thể trả về một cái gì đó như thế này:

Yêu cầu

GET /
Accept: application/json+userdb

Phản ứng

200 OK
Content-Type: application/json+userdb

{
    "version": "1.0",
    "links": [
        {
            "href": "/user",
            "rel": "list",
            "method": "GET"
        },
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Chúng tôi biết từ mô tả về phương tiện truyền thông của mình rằng chúng tôi có thể tìm thấy thông tin về các tài nguyên liên quan từ các phần được gọi là "liên kết". Điều này được gọi là điều khiển Hypermedia . Trong trường hợp này, chúng tôi có thể nói từ một phần như vậy mà chúng tôi có thể tìm thấy danh sách người dùng bằng cách thực hiện một yêu cầu khác cho /user:

Yêu cầu

GET /user
Accept: application/json+userdb

Phản ứng

200 OK
Content-Type: application/json+userdb

{
    "users": [
        {
            "id": 1,
            "name": "Emil",
            "country: "Sweden",
            "links": [
                {
                    "href": "/user/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/1",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/1",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        },
        {
            "id": 2,
            "name": "Adam",
            "country: "Scotland",
            "links": [
                {
                    "href": "/user/2",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/2",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/2",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        }
    ],
    "links": [
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Chúng tôi có thể nói rất nhiều từ phản ứng này. Ví dụ, bây giờ chúng ta biết chúng ta có thể tạo một người dùng mới bằng cách POSTing để /user:

Yêu cầu

POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Karl",
    "country": "Austria"
}

Phản ứng

201 Created
Content-Type: application/json+userdb

{
    "user": {
        "id": 3,
        "name": "Karl",
        "country": "Austria",
        "links": [
            {
                "href": "/user/3",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/3",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/3",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Chúng tôi cũng biết rằng chúng tôi có thể thay đổi dữ liệu hiện có:

Yêu cầu

PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Emil",
    "country": "Bhutan"
}

Phản ứng

200 OK
Content-Type: application/json+userdb

{
    "user": {
        "id": 1,
        "name": "Emil",
        "country": "Bhutan",
        "links": [
            {
                "href": "/user/1",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/1",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/1",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Chú ý rằng chúng ta đang sử dụng động từ HTTP khác nhau ( GET, PUT, POST, DELETEvv) để thao tác các tài nguyên, và rằng những kiến thức duy nhất chúng ta đoán trên một phần của khách hàng là định nghĩa phương tiện truyền thông của chúng tôi.

Đọc thêm:

. lần đầu tiên viết điều này, thay vì ý nghĩa thực sự của nó. Tôi đã sửa đổi câu trả lời để thể hiện tốt hơn ý nghĩa thực sự.)


178
Không. REST không bật lên như một từ thông dụng khác. Nó xuất hiện như một phương tiện để mô tả một sự thay thế cho trao đổi dữ liệu dựa trên SOAP. Thuật ngữ REST giúp đóng khung thảo luận về cách chuyển và truy cập dữ liệu.
tvanfosson

111
Tuy nhiên, trung tâm của REST (trong ứng dụng thực tế) là "không sử dụng GET để thực hiện thay đổi, sử dụng POST / PUT / DELETE", đó là lời khuyên tôi đã nghe (và làm theo) từ rất lâu trước khi SOAP xuất hiện. REST vẫn luôn ở đó, nó chỉ không có một cái tên nào ngoài "cách làm" cho đến gần đây.
Dave Sherohman

37
Đừng quên "Siêu văn bản là công cụ của trạng thái ứng dụng".
Hank Gay

45
Câu trả lời này bỏ lỡ điểm. HTTP hầu như không được đề cập trong luận án của Fielding.
dùng359996

18
Câu trả lời này không đề cập đến mục đích của REST và làm cho nó có vẻ giống như tất cả về các URI sạch. Mặc dù đây có thể là nhận thức phổ biến về REST, nhưng câu trả lời của D.Shawley và oluies chính xác hơn - đó là về việc có thể tận dụng các tính năng được tích hợp trong kiến ​​trúc, như lưu trữ, bằng cách làm việc với nó thay vì chống lại nó. URI đẹp hơn chủ yếu là một tác dụng phụ phổ biến.
TR

534

Lập trình RESTful là về:

  • tài nguyên được xác định bởi một mã định danh liên tục: URI là sự lựa chọn phổ biến của định danh ngày nay
  • các nguồn lực được chế tác sử dụng một tập phổ biến của động từ: HTTP phương pháp là những trường hợp thường thấy - sự đáng kính Create, Retrieve, Update, Deletetrở POST, GET, PUT, và DELETE. Nhưng REST không giới hạn ở HTTP, nó chỉ là phương tiện giao thông được sử dụng phổ biến nhất hiện nay.
  • đại diện thực tế được truy xuất cho một tài nguyên phụ thuộc vào yêu cầu chứ không phải định danh: sử dụng các tiêu đề Chấp nhận để kiểm soát xem bạn có muốn XML, HTTP hay thậm chí là Đối tượng Java đại diện cho tài nguyên không
  • duy trì trạng thái trong đối tượng và thể hiện trạng thái trong biểu diễn
  • biểu diễn các mối quan hệ giữa các tài nguyên trong biểu diễn tài nguyên: các liên kết giữa các đối tượng được nhúng trực tiếp vào biểu diễn
  • biểu diễn tài nguyên mô tả cách sử dụng biểu diễn và trong trường hợp nào nên loại bỏ / tải lại theo cách phù hợp: sử dụng các tiêu đề HTTP Cache-Control

Cái cuối cùng có lẽ là quan trọng nhất về hậu quả và hiệu quả tổng thể của REST. Nhìn chung, hầu hết các cuộc thảo luận RESTful dường như tập trung vào HTTP và việc sử dụng nó từ trình duyệt và những gì không. Tôi hiểu rằng R. Fielding đã đặt ra thuật ngữ khi ông mô tả kiến ​​trúc và các quyết định dẫn đến HTTP. Luận án của ông thiên về kiến ​​trúc và khả năng lưu trữ tài nguyên của bộ đệm hơn là về HTTP.

Nếu bạn thực sự quan tâm đến kiến ​​trúc RESTful là gì và tại sao nó hoạt động, hãy đọc luận án của anh ấy một vài lần và đọc toàn bộ không chỉ Chương 5! Tiếp theo xem xét tại sao DNS hoạt động . Đọc về tổ chức phân cấp của DNS và cách giới thiệu hoạt động. Sau đó đọc và xem xét cách bộ nhớ cache DNS hoạt động. Cuối cùng, hãy đọc các thông số kỹ thuật HTTP (đặc biệt là RFC2616RFC3040 ) và xem xét cách thức và lý do tại sao bộ đệm hoạt động theo cách mà nó làm. Cuối cùng, nó sẽ chỉ cần nhấp. Sự tiết lộ cuối cùng đối với tôi là khi tôi thấy sự tương đồng giữa DNS và HTTP. Sau này, hiểu lý do tại sao các Giao diện Truyền thông và Thông báo có thể mở rộng bắt đầu nhấp vào.

Tôi nghĩ rằng mẹo quan trọng nhất để hiểu tầm quan trọng của kiến ​​trúc và ý nghĩa hiệu suất của kiến trúc RESTful và Shared Không có gì là tránh bị treo lên về công nghệ và chi tiết triển khai. Tập trung vào người sở hữu tài nguyên, người chịu trách nhiệm tạo / duy trì chúng, v.v. Sau đó, hãy suy nghĩ về các đại diện, giao thức và công nghệ.


36
Một câu trả lời cung cấp một danh sách đọc là rất thích hợp cho câu hỏi này.
ellvdben

25
Cảm ơn các cập nhật. PUTPOSTkhông thực sự ánh xạ một-một với cập nhật và tạo. PUTcó thể được sử dụng để tạo nếu máy khách đang ra lệnh URI sẽ là gì. POSTtạo nếu máy chủ đang gán URI mới.
D.Shawley

8
Đừng quên VÒI.
epitka

4
URN là một URI sử dụng urn:lược đồ. Về mặt khái niệm không có sự khác biệt; tuy nhiên, URN yêu cầu bạn có một phương thức được xác định riêng để "định vị" tài nguyên được xác định (được đặt tên) bởi URN. Phải cẩn thận để đảm bảo rằng bạn không giới thiệu khớp nối ngầm khi liên quan đến tài nguyên được đặt tên và vị trí của chúng.
D.Shawley

2
@ellisbben Đồng ý. Nếu tôi hiểu chính xác thì đây là luận văn đã tạo ra REST: ics.uci.edu/~fielding/pub/dissertation/rest_arch_style.htmlm
Philip Couling

408

Đây là những gì nó có thể trông như thế nào.

Tạo người dùng với ba thuộc tính:

POST /user
fname=John&lname=Doe&age=25

Máy chủ trả lời:

200 OK
Location: /user/123

Trong tương lai, sau đó bạn có thể truy xuất thông tin người dùng:

GET /user/123

Máy chủ trả lời:

200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>

Để sửa đổi bản ghi ( lnameagesẽ không thay đổi):

PATCH /user/123
fname=Johnny

Để cập nhật bản ghi (và do đó lnameagesẽ là NULL):

PUT /user/123
fname=Johnny

39
Đối với tôi câu trả lời này nắm bắt được bản chất của câu trả lời mong muốn. Đơn giản và thực dụng. Cấp có rất nhiều tiêu chí khác, nhưng ví dụ được cung cấp là một bệ phóng tuyệt vời.
CyberFonic

92
Trong ví dụ cuối, @pbreitenbach sử dụng PUT fname=Jonny. Điều này sẽ đặt lnameagethành các giá trị mặc định (có thể là NULL hoặc chuỗi rỗng và số nguyên 0), vì PUT ghi đè toàn bộ tài nguyên bằng dữ liệu từ biểu diễn được cung cấp. Đây không phải là những gì được ngụ ý bởi "cập nhật", để thực hiện cập nhật thực sự, hãy sử dụng PATCHphương thức này vì điều này không làm thay đổi các trường không được chỉ định trong biểu diễn.
Nicholas Shanks

24
Nicholas nói đúng. Ngoài ra, URI cho POST đầu tiên tạo người dùng nên được gọi là người dùng vì /user/1không có ý nghĩa và nên có một danh sách tại /users. Câu trả lời phải là một 201 Createdvà không chỉ OK trong trường hợp đó.
DanMan

1
Đây chỉ là một ví dụ về API không nhất thiết phải là api RESTful. Một RESTful có các ràng buộc mà nó tuân thủ. Kiến trúc máy khách-máy chủ, không trạng thái, khả năng lưu trữ bộ đệm, hệ thống phân lớp, giao diện thống nhất.
Phóng xạ

Đó là một câu trả lời rất nhỏ gọn bao gồm tất cả các phương thức truy cập http servlet
Himanshu Ahuja

181

Một cuốn sách tuyệt vời về REST là REST in Practice .

Phải đọc là Chuyển giao trạng thái đại diện (REST)API REST phải được điều khiển siêu văn bản

Xem bài viết của Martin Fowlers về Mô hình trưởng thành của Richardson (RMM) để được giải thích về dịch vụ RESTful là gì.

Mô hình trưởng thành của Richardson

Để trở thành RESTful, một Dịch vụ cần phải hoàn thành Hypermedia làm Trạng thái Ứng dụng. (HATEOAS) , nghĩa là, nó cần đạt cấp 3 trong RMM, đọc bài viết để biết chi tiết hoặc các slide từ bài nói chuyện của qcon .

Ràng buộc HATEOAS là từ viết tắt của Hypermedia với tư cách là Công cụ của Trạng thái Ứng dụng. Nguyên tắc này là điểm khác biệt chính giữa REST và hầu hết các dạng khác của hệ thống máy chủ khách.

...

Một khách hàng của ứng dụng RESTful chỉ cần biết một URL cố định duy nhất để truy cập nó. Tất cả các hành động trong tương lai phải được phát hiện một cách linh hoạt từ các liên kết hypermedia có trong các đại diện của các tài nguyên được trả về từ URL đó. Các loại phương tiện được tiêu chuẩn hóa cũng được dự kiến ​​sẽ được hiểu bởi bất kỳ khách hàng nào có thể sử dụng API RESTful. (Từ Wikipedia, bách khoa toàn thư miễn phí)

REST Litmus Test cho Web Frameworks là một thử nghiệm trưởng thành tương tự cho các khung web.

Tiếp cận REST thuần túy: Học cách yêu HATEOAS là một bộ sưu tập tốt các liên kết.

REST so với SOAP cho Đám mây Công cộng thảo luận về mức độ sử dụng REST hiện tại.

REST và phiên bản thảo luận về Khả năng mở rộng, Phiên bản, Khả năng phát triển, v.v. thông qua Sửa đổi


5
Tôi nghĩ rằng câu trả lời này chạm đến điểm chính của việc hiểu REST: từ đại diện có nghĩa là gì. Cấp 1 - Tài nguyên nói về nhà nước . Cấp độ 2 - Động từ HTTP nói về chuyển giao (đọc thay đổi ). Cấp độ 3 - HATEOAS cho biết thúc đẩy chuyển giao trong tương lai thông qua đại diện (trả lại JSON / XML / HTML), có nghĩa là bạn đã biết cách nói vòng tiếp theo với thông tin được trả về. Vì vậy, REST đọc: "(biểu diễn (chuyển trạng thái))", thay vì "(chuyển trạng thái đại diện)".
lcn


136

REST là gì?

REST là viết tắt của Chuyển giao Nhà nước Đại diện. (Đôi khi nó được đánh vần là "ReST".) Nó dựa trên một giao thức truyền thông không trạng thái, máy chủ, máy chủ lưu trữ - và trong hầu hết mọi trường hợp, giao thức HTTP được sử dụng.

REST là một kiểu kiến ​​trúc để thiết kế các ứng dụng nối mạng. Ý tưởng là, thay vì sử dụng các cơ chế phức tạp như CORBA, RPC hoặc SOAP để kết nối giữa các máy, HTTP đơn giản được sử dụng để thực hiện cuộc gọi giữa các máy.

Theo nhiều cách, World Wide Web, dựa trên HTTP, có thể được xem như một kiến ​​trúc dựa trên REST. Các ứng dụng RESTful sử dụng các yêu cầu HTTP để đăng dữ liệu (tạo và / hoặc cập nhật), đọc dữ liệu (ví dụ: thực hiện truy vấn) và xóa dữ liệu. Do đó, REST sử dụng HTTP cho cả bốn thao tác CRUD (Tạo / Đọc / Cập nhật / Xóa).

REST là một giải pháp thay thế nhẹ cho các cơ chế như RPC (Cuộc gọi thủ tục từ xa) và Dịch vụ web (SOAP, WSDL, et al.). Sau đó, chúng ta sẽ thấy REST đơn giản hơn nhiều.

Mặc dù đơn giản, REST có đầy đủ tính năng; về cơ bản không có gì bạn có thể làm trong Dịch vụ web không thể thực hiện được với kiến ​​trúc RESTful. REST không phải là "tiêu chuẩn". Chẳng hạn, sẽ không bao giờ có khuyến nghị W3C cho REST. Và trong khi có các khung lập trình REST, làm việc với REST đơn giản đến mức bạn có thể thường xuyên "tự lăn" với các tính năng thư viện tiêu chuẩn bằng các ngôn ngữ như Perl, Java hoặc C #.

Một trong những tài liệu tham khảo tốt nhất tôi tìm thấy khi tôi cố gắng tìm ý nghĩa thực sự đơn giản của phần còn lại.

http://rest.elkstein.org/


Đây là một câu trả lời thực sự súc tích. Bạn cũng có thể mô tả tại sao REST được gọi là không trạng thái?
Chaklader Asfak Arefe

89

REST đang sử dụng các phương thức HTTP khác nhau (chủ yếu là GET / PUT / DELETE) để thao tác dữ liệu.

Thay vì sử dụng một URL cụ thể để xóa một phương thức (giả sử /user/123/delete), bạn sẽ gửi yêu cầu XÓA tới /user/[id]URL, để chỉnh sửa người dùng, để truy xuất thông tin về người dùng mà bạn gửi yêu cầu GET tới/user/[id]

Ví dụ: thay vì một tập hợp các URL có thể trông giống như một số điều sau đây ..

GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

Bạn sử dụng các "động từ" HTTP và có ..

GET /user/2
DELETE /user/2
PUT /user

18
Đó là "sử dụng HTTP đúng", mà không phải là giống như "yên tĩnh" (mặc dù nó có liên quan đến nó)
Julian Reschke

2
Bạn cũng có thể sử dụng / user / del / 2 và / user / remove / 2 hoặc ... GET / DELETE / PUT / POST chỉ là cách chuẩn hóa, "phù hợp" để làm những việc như vậy (và như Julian nói, đó không phải là tất cả có để REST)
dbr

1
Chắc chắn, nhưng đó không phải là lý do để tránh chúng .. REST chỉ giúp bạn tiết kiệm lại bánh xe mỗi lần. Đối với một API, REST rất tuyệt vời (tính nhất quán!), Nhưng đối với việc cấu trúc một trang web ngẫu nhiên, điều đó không thực sự quan trọng như tôi nói (nó có thể rắc rối hơn giá trị của nó)
dbr

14
Vadim, đó đơn giản là RPC. Việc sử dụng GET để sửa đổi dữ liệu cũng rất nguy hiểm vì (trong số các lý do khác), công cụ tìm kiếm có thể thu thập các liên kết xóa của bạn và truy cập tất cả.
aehlke

7
@aehlke - Tôi nghĩ câu hỏi thực sự sẽ là "Tại sao một người dùng ẩn danh có khả năng xóa hồ sơ khỏi hệ thống của bạn?"
Spencer Ruport

68

Đó là lập trình trong đó kiến ​​trúc của hệ thống của bạn phù hợp với phong cách REST được trình bày bởi Roy Fielding trong luận án của mình . Vì đây là phong cách kiến ​​trúc mô tả web (ít nhiều), rất nhiều người quan tâm đến nó.

Phần thưởng trả lời: Không. Trừ khi bạn học kiến ​​trúc phần mềm như một dịch vụ web học thuật hoặc thiết kế, thực sự không có lý do gì để nghe thuật ngữ này.


2
nhưng không đơn giản .. làm cho nó phức tạp hơn mà nó cần phải được.
hasen

4
Ngoài ra, mặc dù các thuật ngữ REST và RESTful hầu như chỉ được sử dụng trong lĩnh vực ứng dụng web ngay bây giờ, về mặt kỹ thuật không có gì ràng buộc REST với HTTP.
Hank Gay

3
Blog của Fielding có một số bài viết hay, dễ hiểu hơn về REST và những hiểu lầm phổ biến: roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
aehlke 20/07/2012

3
@HankGay Tôi nghĩ lý do không bí mật hơn là hầu hết các nhà phát triển dịch vụ web đều xem REST như một sự đơn giản hóa tuyệt vời so với các lựa chọn thay thế như SOAP. Họ không nhất thiết phải tuân thủ tất cả các kỹ thuật REST chính xác - và điều đó có thể khiến những kẻ cuồng tín REST phát điên - nhưng trong hầu hết các trường hợp, họ có thể không cần phải lo lắng về những điều như đảm bảo kết quả của họ là "siêu kích hoạt".
psychboom

47

Tôi có thể nói lập trình RESTful sẽ là về việc tạo các hệ thống (API) theo phong cách kiến ​​trúc REST.

Tôi đã tìm thấy hướng dẫn tuyệt vời, ngắn gọn và dễ hiểu này về REST của Tiến sĩ M. Elkstein và trích dẫn phần thiết yếu sẽ trả lời câu hỏi của bạn cho phần lớn:

Tìm hiểu REST: Hướng dẫn

REST là một kiểu kiến ​​trúc để thiết kế các ứng dụng nối mạng. Ý tưởng là, thay vì sử dụng các cơ chế phức tạp như CORBA, RPC hoặc SOAP để kết nối giữa các máy, HTTP đơn giản được sử dụng để thực hiện cuộc gọi giữa các máy.

  • Theo nhiều cách, World Wide Web, dựa trên HTTP, có thể được xem như một kiến ​​trúc dựa trên REST.

Các ứng dụng RESTful sử dụng các yêu cầu HTTP để đăng dữ liệu (tạo và / hoặc cập nhật), đọc dữ liệu (ví dụ: thực hiện truy vấn) và xóa dữ liệu. Do đó, REST sử dụng HTTP cho cả bốn thao tác CRUD (Tạo / Đọc / Cập nhật / Xóa).

Tôi không nghĩ bạn nên cảm thấy ngu ngốc khi không nghe về REST bên ngoài Stack Overflow ..., tôi sẽ ở trong tình huống tương tự!; câu trả lời cho câu hỏi SO khác này về lý do tại sao REST trở nên lớn hơn bây giờ có thể làm dịu một số cảm xúc.


Bài viết này giải thích mối quan hệ giữa HTTP và REST freecodecamp.org/news/ từ
Only You

45

Tôi xin lỗi nếu tôi không trả lời trực tiếp câu hỏi, nhưng sẽ dễ hiểu hơn tất cả những điều này với các ví dụ chi tiết hơn. Fielding không dễ hiểu do tất cả sự trừu tượng và thuật ngữ.

Có một ví dụ khá hay ở đây:

Giải thích về REST và Hypertext: Spam-E Robot dọn dẹp thư rác

Và thậm chí tốt hơn, có một lời giải thích rõ ràng với các ví dụ đơn giản ở đây (powerpoint toàn diện hơn, nhưng bạn có thể nhận được hầu hết trong phiên bản html):

http://www.xfront.com/REST.ppt hoặc http://www.xfront.com/REST.html

Sau khi đọc các ví dụ, tôi có thể thấy tại sao Ken nói rằng REST được điều khiển siêu văn bản. Tôi thực sự không chắc chắn rằng anh ấy đúng, bởi vì / user / 123 là một URI trỏ đến một tài nguyên và đối với tôi không rõ ràng rằng nó không HẤP DẪN chỉ vì khách hàng biết về nó "ngoài băng tần".

Tài liệu xfront đó giải thích sự khác biệt giữa REST và SOAP và điều này cũng thực sự hữu ích. Khi Fielding nói, " Đó là RPC. Nó hét RPC. ", Rõ ràng RPC không phải là RESTful, vì vậy thật hữu ích khi xem lý do chính xác cho việc này. (SOAP là một loại RPC.)


12
liên kết mát mẻ, cảm ơn. Tôi mệt mỏi với những anh chàng REST nói rằng một số ví dụ không phải là "REST-Ful", nhưng sau đó từ chối nói làm thế nào để thay đổi ví dụ thành REST-Ful.
coder_tim

38

REST là gì?

REST nói theo cách chính thức, REST là một kiểu kiến ​​trúc được xây dựng trên các nguyên tắc nhất định bằng cách sử dụng các nguyên tắc cơ bản hiện tại của Web Web. Có 5 nguyên tắc cơ bản của web được tận dụng để tạo ra các dịch vụ REST.

  • Nguyên tắc 1: Mọi thứ đều là Tài nguyên Theo kiểu kiến ​​trúc REST, dữ liệu và chức năng được coi là tài nguyên và được truy cập bằng Mã định danh tài nguyên thống nhất (URI), thường là các liên kết trên Web.
  • Nguyên tắc 2: Mọi tài nguyên được xác định bằng một mã định danh duy nhất (URI)
  • Nguyên tắc 3: Sử dụng giao diện đơn giản và thống nhất
  • Nguyên tắc 4: Giao tiếp được thực hiện bằng cách đại diện
  • Nguyên tắc 5: Không quốc tịch

1
Communication is Done by Representationnghĩa là gì?
mendez7

33

Tôi thấy một loạt các câu trả lời nói rằng đặt mọi thứ về người dùng 123 vào tài nguyên "/ user / 123" là RESTful.

Roy Fielding, người đặt ra thuật ngữ này, nói rằng API REST phải được điều khiển siêu văn bản . Cụ thể, "API REST không được xác định tên hoặc cấu trúc phân cấp tài nguyên cố định".

Vì vậy, nếu đường dẫn "/ user / 123" của bạn được mã hóa cứng trên máy khách, thì nó không thực sự RESTful. Một cách sử dụng tốt HTTP, có thể, có thể không. Nhưng không PHỤC HỒI. Nó phải đến từ siêu văn bản.


7
vậy .... làm thế nào mà ví dụ đó được yên tĩnh? Làm thế nào bạn sẽ thay đổi url để làm cho nó yên tĩnh?
hasen

1
hasen: Sử dụng một tài nguyên cho tất cả các hoạt động có thể cần thiết cho RESTfulness, nhưng không đủ .
Ken

18
ok tốt .. bạn có thể giải thích thêm? Quan điểm của câu nói "không có những người này là sai .. Tôi biết điều gì đúng" mà không nói những gì bạn biết (hoặc nghĩ) là đúng?
hasen

5
Tôi đã đưa liên kết đến mô tả của Fielding. Tôi nghĩ rằng tôi đã nói chính xác sự khác biệt có liên quan đến các phản ứng khác: cần phải được điều khiển bởi siêu văn bản. Nếu "/ user / 123" xuất phát từ một số tài liệu API ngoài băng, thì đó không phải là RESTful. Nếu nó đến từ một định danh tài nguyên trong siêu văn bản của bạn, thì nó là.
Ken

1
Hoặc bạn có thể sử dụng một điểm nhập như / users / và nó sẽ cung cấp cho bạn một danh sách các tài nguyên người dùng VÀ URI cho mỗi điểm. Sau đó, tài nguyên có thể được khám phá và điều hướng là siêu văn bản điều khiển.
aehlke

26

Câu trả lời rất đơn giản, có một luận văn được viết bởi Roy Fielding.] 1 Trong luận án đó, ông định nghĩa các nguyên tắc REST. Nếu một ứng dụng đáp ứng tất cả các nguyên tắc đó, thì đó là ứng dụng REST.

Thuật ngữ RESTful được tạo vì ppl làm cạn kiệt từ REST bằng cách gọi ứng dụng không phải REST của họ là REST. Sau đó, thuật ngữ RESTful cũng đã cạn kiệt. Ngày nay chúng ta đang nói về API Web và API Hypermedia , bởi vì hầu hết các ứng dụng REST được gọi là không hoàn thành phần HATEOAS của ràng buộc giao diện thống nhất.

Các ràng buộc REST như sau:

  1. kiến trúc máy khách-máy chủ

    Vì vậy, nó không hoạt động với các socket PUB / SUB, ví dụ, nó dựa trên REQ / REP.

  2. giao tiếp không quốc tịch

    Vì vậy, máy chủ không duy trì trạng thái của khách hàng. Điều này có nghĩa là bạn không thể sử dụng máy chủ lưu trữ phiên bên và bạn phải xác thực mọi yêu cầu. Khách hàng của bạn có thể gửi các tiêu đề xác thực cơ bản thông qua kết nối được mã hóa. (Bằng các ứng dụng lớn, thật khó để duy trì nhiều phiên.)

  3. sử dụng bộ đệm nếu bạn có thể

    Vì vậy, bạn không phải phục vụ cùng một yêu cầu nhiều lần.

  4. giao diện thống nhất như hợp đồng chung giữa máy khách và máy chủ

    Hợp đồng giữa máy khách và máy chủ không được duy trì bởi máy chủ. Nói cách khác, khách hàng phải được tách rời khỏi việc thực hiện dịch vụ. Bạn có thể đạt đến trạng thái này bằng cách sử dụng các giải pháp tiêu chuẩn, như tiêu chuẩn IRI (URI) để xác định tài nguyên, tiêu chuẩn HTTP để trao đổi thông điệp, các loại MIME tiêu chuẩn để mô tả định dạng tuần tự hóa cơ thể, siêu dữ liệu (có thể là vocab RDF, microformats, v.v.) mô tả ngữ nghĩa của các phần khác nhau của cơ thể thông điệp. Để tách cấu trúc IRI khỏi máy khách, bạn phải gửi siêu liên kết đến máy khách ở các định dạng hypermedia như (HTML, JSON-LD, HAL, v.v.). Vì vậy, khách hàng có thể sử dụng siêu dữ liệu (có thể là quan hệ liên kết, các từ vựng RDF) được gán cho các siêu liên kết để điều hướng máy trạng thái của ứng dụng thông qua các chuyển đổi trạng thái phù hợp để đạt được mục tiêu hiện tại.

    Ví dụ: khi khách hàng muốn gửi đơn đặt hàng đến webshop, thì nó phải kiểm tra các siêu liên kết trong các phản hồi được gửi bởi webshop. Bằng cách kiểm tra các liên kết, nó tìm thấy một liên kết được mô tả với http://schema.org/OrderAction . Máy khách biết vocab giản đồ.org, vì vậy nó hiểu rằng bằng cách kích hoạt siêu liên kết này, nó sẽ gửi đơn đặt hàng. Vì vậy, nó kích hoạt siêu liên kết và gửi một POST https://example.com/api/v1/ordertin nhắn với cơ thể thích hợp. Sau đó, dịch vụ xử lý thông báo và trả lời với kết quả có tiêu đề trạng thái HTTP phù hợp, ví dụ như 201 - createdthành công. Để chú thích các thông điệp với siêu dữ liệu chi tiết, giải pháp tiêu chuẩn sử dụng định dạng RDF, ví dụ JSON-LD với một từ vựng REST, ví dụ như Hydra và các từ vựng cụ thể của miền nhưlược đồ.org hoặc bất kỳ vocab dữ liệu được liên kết nào khác và có thể là một vocab cụ thể của ứng dụng tùy chỉnh nếu cần. Bây giờ điều này không dễ dàng, đó là lý do tại sao hầu hết các ppl sử dụng HAL và các định dạng đơn giản khác thường chỉ cung cấp một vocab REST, nhưng không hỗ trợ dữ liệu được liên kết.

  5. xây dựng một hệ thống lớp để tăng khả năng mở rộng

    Hệ thống REST bao gồm các lớp phân cấp. Mỗi lớp chứa các thành phần sử dụng dịch vụ của các thành phần nằm trong lớp tiếp theo bên dưới. Vì vậy, bạn có thể thêm các lớp mới và các thành phần dễ dàng.

    Ví dụ, có một lớp máy khách chứa các máy khách và bên dưới có một lớp dịch vụ chứa một dịch vụ duy nhất. Bây giờ bạn có thể thêm bộ đệm phía máy khách giữa chúng. Sau đó, bạn có thể thêm một phiên bản dịch vụ khác và bộ cân bằng tải, v.v ... Mã khách hàng và mã dịch vụ sẽ không thay đổi.

  6. mã theo yêu cầu để mở rộng chức năng khách hàng

    Ràng buộc này là tùy chọn. Ví dụ: bạn có thể gửi trình phân tích cú pháp cho một loại phương tiện cụ thể đến máy khách, v.v ... Để làm điều này, bạn có thể cần một hệ thống trình tải plugin tiêu chuẩn trong máy khách, hoặc máy khách của bạn sẽ được ghép nối với giải pháp trình tải plugin .

Các ràng buộc REST dẫn đến một hệ thống có khả năng mở rộng cao, trong đó các máy khách được tách rời khỏi việc triển khai các dịch vụ. Vì vậy, các máy khách có thể được sử dụng lại, nói chung giống như các trình duyệt trên web. Các khách hàng và dịch vụ có chung các tiêu chuẩn và từ vựng, vì vậy họ có thể hiểu nhau mặc dù thực tế là khách hàng không biết chi tiết triển khai dịch vụ. Điều này cho phép tạo các máy khách tự động có thể tìm và sử dụng các dịch vụ REST để đạt được mục tiêu của chúng. Về lâu dài, những khách hàng này có thể giao tiếp với nhau và tin tưởng lẫn nhau bằng các nhiệm vụ, giống như con người. Nếu chúng ta thêm mô hình học tập vào các máy khách như vậy, thì kết quả sẽ là một hoặc nhiều AI sử dụng web của máy thay vì một công viên máy chủ. Vì vậy, vào cuối giấc mơ của Berners Lee: web ngữ nghĩa và trí tuệ nhân tạo sẽ là hiện thực. Vì vậy, vào năm 2030, chúng tôi đã kết thúc bằng Skynet. Cho đến lúc đó ... ;-)


22

Lập trình API RESTful (Chuyển trạng thái đại diện) đang viết các ứng dụng web bằng bất kỳ ngôn ngữ lập trình nào bằng cách tuân theo 5 nguyên tắc kiểu kiến ​​trúc phần mềm cơ bản :

  1. Tài nguyên (dữ liệu, thông tin).
  2. Mã định danh toàn cầu duy nhất (tất cả các tài nguyên là duy nhất được xác định bởi URI ).
  3. Giao diện thống nhất - sử dụng giao diện đơn giản và chuẩn (HTTP).
  4. Đại diện - tất cả các giao tiếp được thực hiện bằng cách biểu diễn (ví dụ: XML / JSON )
  5. Không trạng thái (mọi yêu cầu xảy ra trong sự cô lập hoàn toàn, việc lưu trữ và cân bằng tải dễ dàng hơn),

Nói cách khác, bạn đang viết các ứng dụng mạng điểm-điểm đơn giản qua HTTP, sử dụng các động từ như GET, POST, PUT hoặc DELETE bằng cách triển khai kiến ​​trúc RESTful, đề xuất tiêu chuẩn hóa giao diện mà mỗi tài nguyên của Tráng xuất hiện. Không có gì là sử dụng các tính năng hiện tại của web một cách đơn giản và hiệu quả (kiến trúc phân tán và thành công cao). Nó là một thay thế cho các cơ chế phức tạp hơn như SOAP , CORBARPC .

Lập trình RESTful phù hợp với thiết kế kiến ​​trúc Web và, nếu được triển khai đúng cách, nó cho phép bạn tận dụng tối đa lợi thế của cơ sở hạ tầng Web có thể mở rộng.


17

Nếu tôi phải giảm luận văn ban đầu về REST xuống chỉ còn 3 câu ngắn, tôi nghĩ những điều sau đây nắm bắt được bản chất của nó:

  1. Tài nguyên được yêu cầu thông qua URL.
  2. Các giao thức được giới hạn ở những gì bạn có thể giao tiếp bằng cách sử dụng URL.
  3. Siêu dữ liệu được truyền dưới dạng cặp giá trị tên (dữ liệu bài và tham số chuỗi truy vấn).

Sau đó, thật dễ dàng để rơi vào các cuộc tranh luận về thích ứng, quy ước mã hóa và thực tiễn tốt nhất.

Thật thú vị, không có đề cập đến các hoạt động HTTP POST, GET, DELETE hoặc PUT trong luận án. Đó phải là cách giải thích sau này của một người nào đó về "thực tiễn tốt nhất" cho "giao diện thống nhất".

Khi nói đến các dịch vụ web, có vẻ như chúng ta cần một số cách để phân biệt các kiến ​​trúc dựa trên WSDL và SOAP, có thêm chi phí đáng kể và có thể phức tạp không cần thiết cho giao diện. Họ cũng yêu cầu các khung và công cụ phát triển bổ sung để thực hiện. Tôi không chắc chắn liệu REST có phải là thuật ngữ tốt nhất để phân biệt giữa các giao diện thông thường và các giao diện được thiết kế quá mức như WSDL và SOAP hay không. Nhưng chúng ta cần một cái gì đó.


17

REST là một mô hình kiến ​​trúc và phong cách viết các ứng dụng phân tán. Nó không phải là một phong cách lập trình theo nghĩa hẹp.

Nói rằng bạn sử dụng phong cách REST tương tự như việc bạn xây dựng một ngôi nhà theo một phong cách cụ thể: ví dụ Tudor hoặc Victoria. Cả REST là kiểu phần mềm và Tudor hoặc Victoria là kiểu nhà đều có thể được xác định bởi các phẩm chất và ràng buộc tạo nên chúng. Ví dụ REST phải có phân tách Máy chủ Máy khách trong đó các thông báo tự mô tả. Các ngôi nhà theo phong cách Tudor có các đầu hồi chồng chéo và Mái nhà dốc thẳng với các đầu hồi phía trước. Bạn có thể đọc luận văn của Roy để tìm hiểu thêm về những hạn chế và phẩm chất tạo nên REST.

REST không giống như kiểu nhà đã có một thời gian khó khăn được áp dụng nhất quán và thực tế. Điều này có thể đã được cố ý. Để lại việc thực hiện thực tế của nó cho đến các nhà thiết kế. Vì vậy, bạn có thể tự do làm những gì bạn muốn miễn là bạn đáp ứng các ràng buộc được nêu trong luận án bạn đang tạo Hệ thống REST.

Tặng kem:

Toàn bộ web dựa trên REST (hoặc REST dựa trên web). Do đó, là một nhà phát triển web, bạn có thể muốn biết điều đó mặc dù không cần thiết phải viết các ứng dụng web tốt.


17

Đây là phác thảo cơ bản của tôi về REST. Tôi đã cố gắng thể hiện suy nghĩ đằng sau mỗi thành phần trong kiến ​​trúc RESTful để hiểu khái niệm này trực quan hơn. Hy vọng rằng điều này sẽ giúp làm sáng tỏ REST cho một số người!

REST (Chuyển giao trạng thái đại diện) là một kiến ​​trúc thiết kế phác thảo cách các tài nguyên được nối mạng (tức là các nút chia sẻ thông tin) được thiết kế và xử lý. Nói chung, kiến ​​trúc RESTful làm cho nó để máy khách (máy yêu cầu) và máy chủ (máy phản hồi) có thể yêu cầu đọc, ghi và cập nhật dữ liệu mà không cần máy khách phải biết máy chủ hoạt động như thế nào và máy chủ có thể vượt qua nó trở lại mà không cần biết gì về khách hàng. Được rồi, tuyệt ... nhưng làm thế nào để chúng ta làm điều này trong thực tế?

  • Yêu cầu rõ ràng nhất là cần phải có một ngôn ngữ phổ quát nào đó để máy chủ có thể cho khách hàng biết họ đang cố gắng làm gì với yêu cầu và để máy chủ phản hồi.

  • Nhưng để tìm bất kỳ tài nguyên nào và sau đó cho khách hàng biết tài nguyên đó sống ở đâu, cần phải có một cách phổ quát để chỉ vào tài nguyên. Đây là nơi các Mã định danh tài nguyên chung (URI) xuất hiện; về cơ bản chúng là các địa chỉ duy nhất để tìm tài nguyên.

Nhưng kiến ​​trúc REST không kết thúc ở đó! Mặc dù ở trên đáp ứng các nhu cầu cơ bản của những gì chúng tôi muốn, chúng tôi cũng muốn có một kiến ​​trúc hỗ trợ lưu lượng lớn vì bất kỳ máy chủ nào cũng thường xử lý các phản hồi từ một số khách hàng. Do đó, chúng tôi không muốn áp đảo máy chủ bằng cách nhớ thông tin về các yêu cầu trước đó.

  • Do đó, chúng tôi áp đặt hạn chế rằng mỗi cặp phản hồi yêu cầu giữa máy khách và máy chủ là độc lập, có nghĩa là máy chủ không phải nhớ bất cứ điều gì về các yêu cầu trước đó (trạng thái tương tác giữa máy khách-máy chủ) để đáp ứng mới yêu cầu. Điều này có nghĩa là chúng tôi muốn các tương tác của chúng tôi là không trạng thái.

  • Để giảm bớt căng thẳng cho máy chủ của chúng tôi khỏi việc tính toán lại các tính toán đã được thực hiện gần đây cho một khách hàng nhất định, REST cũng cho phép lưu vào bộ đệm. Về cơ bản, bộ nhớ đệm có nghĩa là chụp ảnh phản hồi ban đầu được cung cấp cho khách hàng. Nếu khách hàng thực hiện lại yêu cầu tương tự, máy chủ có thể cung cấp cho khách hàng ảnh chụp nhanh thay vì làm lại tất cả các tính toán cần thiết để tạo phản hồi ban đầu. Tuy nhiên, vì là ảnh chụp nhanh, nếu ảnh chụp nhanh chưa hết hạn - máy chủ sẽ đặt trước thời gian hết hạn - và phản hồi đã được cập nhật kể từ bộ đệm ban đầu (nghĩa là yêu cầu sẽ đưa ra câu trả lời khác với phản hồi được lưu trong bộ nhớ cache) , khách hàng sẽ không thấy các bản cập nhật cho đến khi bộ đệm hết hạn (hoặc bộ đệm bị xóa) và phản hồi được hiển thị lại từ đầu.

  • Điều cuối cùng mà bạn thường ở đây về kiến ​​trúc RESTful là chúng được xếp lớp. Chúng tôi thực sự đã thảo luận về yêu cầu này trong cuộc thảo luận về sự tương tác giữa máy khách và máy chủ. Về cơ bản, điều này có nghĩa là mỗi lớp trong hệ thống của chúng tôi chỉ tương tác với các lớp liền kề. Vì vậy, trong cuộc thảo luận của chúng tôi, lớp máy khách tương tác với lớp máy chủ của chúng tôi (và ngược lại), nhưng có thể có các lớp máy chủ khác giúp máy chủ chính xử lý yêu cầu mà máy khách không trực tiếp liên lạc. Thay vào đó, máy chủ chuyển yêu cầu khi cần thiết.

Bây giờ, nếu tất cả điều này nghe có vẻ quen thuộc, thì tuyệt vời. Giao thức truyền siêu văn bản (HTTP), định nghĩa giao thức giao tiếp qua World Wide Web là một triển khai khái niệm trừu tượng về kiến ​​trúc RESTful (hoặc một thể hiện của lớp REST nếu bạn là người cuồng OOP như tôi). Trong triển khai REST này, máy khách và máy chủ tương tác thông qua GET, POST, PUT, DELETE, v.v., là một phần của ngôn ngữ phổ quát và các tài nguyên có thể được trỏ đến bằng cách sử dụng URL.


15

Tôi nghĩ rằng điểm đáng chú ý là sự tách biệt trạng thái thành một lớp cao hơn trong khi sử dụng internet (giao thức) như một lớp vận chuyển phi trạng thái . Hầu hết các cách tiếp cận khác trộn lẫn mọi thứ.

Đó là cách tiếp cận thực tế tốt nhất để xử lý những thay đổi cơ bản của lập trình trong thời đại internet. Về những thay đổi cơ bản, Erik Meijer có một cuộc thảo luận về chương trình tại đây: http://www.infoq.com/interviews/erik-meijer-programming-lingu-design-effects-purity#view_93197 . Ông tóm tắt nó như năm hiệu ứng, và trình bày một giải pháp bằng cách thiết kế giải pháp thành ngôn ngữ lập trình. Giải pháp, cũng có thể đạt được ở cấp độ nền tảng hoặc hệ thống, bất kể ngôn ngữ. Restful có thể được coi là một trong những giải pháp đã rất thành công trong thực tế hiện nay.

Với phong cách yên tĩnh, bạn có được và điều khiển trạng thái của ứng dụng trên một mạng internet không đáng tin cậy. Nếu nó không hoạt động hiện tại để có được trạng thái chính xác và hiện tại, nó cần hiệu trưởng xác thực bằng không để giúp ứng dụng tiếp tục. Nếu nó không thao túng trạng thái, nó thường sử dụng nhiều giai đoạn xác nhận để giữ cho mọi thứ chính xác. Theo nghĩa này, phần còn lại không phải là một giải pháp toàn bộ, nó cần các chức năng trong phần khác của ngăn xếp ứng dụng web để hỗ trợ hoạt động của nó.

Với quan điểm này, phong cách còn lại không thực sự gắn liền với internet hoặc ứng dụng web. Đó là một giải pháp cơ bản cho nhiều tình huống lập trình. Nó cũng không đơn giản, nó chỉ làm cho giao diện thực sự đơn giản, và đối phó với các công nghệ khác rất tốt.

Chỉ cần 2c của tôi.

Chỉnh sửa: Hai khía cạnh quan trọng hơn:


1
Một quan điểm MVC : Blog Phần còn lại Thực tiễn tồi tệ nhất đề nghị không kết hợp các mô hình và tài nguyên . Cuốn sách Two Scoops of django gợi ý rằng Rest API là chế độ xem và không trộn lẫn logic kinh doanh vào chế độ xem. Mã cho ứng dụng nên được giữ lại trong ứng dụng.
minghua


14

Đây là "cuộc thảo luận" dài đáng kinh ngạc và khá khó hiểu để nói ít nhất.

IMO:

1) Không có thứ gọi là lập trình yên tĩnh, không có khớp lớn và nhiều bia :)

2) Chuyển giao trạng thái đại diện (REST) ​​là một kiểu kiến ​​trúc được chỉ định trong luận án của Roy Fielding . Nó có một số hạn chế. Nếu Dịch vụ / Khách hàng của bạn tôn trọng những thứ đó thì đó là RESTful. Đây là nó.

Bạn có thể tóm tắt (đáng kể) các ràng buộc đối với:

  • giao tiếp không quốc tịch
  • tôn trọng thông số kỹ thuật HTTP (nếu HTTP được sử dụng)
  • truyền đạt rõ ràng các định dạng nội dung được truyền
  • sử dụng hypermedia làm công cụ của trạng thái ứng dụng

Có một bài viết rất hay giải thích những điều độc đáo.

Rất nhiều câu trả lời sao chép / dán thông tin hợp lệ trộn nó và thêm một số nhầm lẫn. Mọi người nói ở đây về các cấp độ, về các URI RESTFul (không có vấn đề nào như vậy!), Áp dụng các phương thức HTTP GET, POST, PUT ... REST không phải là về điều đó hay không chỉ về điều đó.

Ví dụ: liên kết - thật tuyệt khi có API trông đẹp mắt nhưng cuối cùng, máy khách / máy chủ không thực sự quan tâm đến các liên kết bạn nhận / gửi, đó là nội dung quan trọng.

Cuối cùng, bất kỳ máy khách RESTful nào cũng có thể sử dụng cho bất kỳ dịch vụ RESTful nào miễn là định dạng nội dung được biết đến.


14

Câu hỏi cũ, cách trả lời mới. Có rất nhiều quan niệm sai lầm về khái niệm này. Tôi luôn cố gắng ghi nhớ:

  1. URL có cấu trúc và Phương thức / Động từ http không phải là định nghĩa của lập trình nghỉ ngơi.
  2. JSON không phải là lập trình yên tĩnh
  3. Lập trình RESTful không dành cho API

Tôi định nghĩa lập trình yên tĩnh là

Một ứng dụng rất yên tĩnh nếu nó cung cấp tài nguyên (là sự kết hợp của các điều khiển chuyển đổi trạng thái + dữ liệu) trong một loại phương tiện mà khách hàng hiểu

Để trở thành một lập trình viên yên tĩnh, bạn phải cố gắng xây dựng các ứng dụng cho phép các diễn viên thực hiện mọi việc. Không chỉ phơi bày cơ sở dữ liệu.

Các điều khiển chuyển trạng thái chỉ có ý nghĩa nếu máy khách và máy chủ đồng ý với cách biểu diễn loại tài nguyên của phương tiện. Mặt khác, không có cách nào để biết điều khiển là gì và điều gì không và cách thực hiện điều khiển. IE nếu trình duyệt không biết <form>thẻ trong html thì sẽ không có gì để bạn gửi đến trạng thái chuyển tiếp trong trình duyệt của bạn.

Tôi không muốn tự quảng bá, nhưng tôi mở rộng những ý tưởng này đến chiều sâu trong bài nói chuyện của mình http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .

Một đoạn trích từ bài nói chuyện của tôi là về mô hình trưởng thành thường được nhắc đến của richardson, tôi không tin vào các cấp độ, bạn là RESTful (cấp 3) hoặc bạn thì không, nhưng điều tôi muốn gọi là về mỗi cấp độ làm cho bạn trên đường đến RESTful

mô hình trưởng thành richardson chú thích



11

REST === Tương tự HTTP là không chính xác cho đến khi bạn không nhấn mạnh đến thực tế rằng nó "PHẢI" được điều khiển HATEOAS .

Chính Roy đã xóa nó ở đây .

Nên nhập API REST mà không có kiến ​​thức trước ngoài URI (dấu trang) ban đầu và tập hợp các loại phương tiện được tiêu chuẩn hóa phù hợp với đối tượng dự định (nghĩa là, bất kỳ khách hàng nào có thể sử dụng API đều hiểu). Từ thời điểm đó, tất cả các chuyển đổi trạng thái ứng dụng phải được điều khiển bởi lựa chọn máy khách do các lựa chọn do máy chủ cung cấp có trong các biểu diễn nhận được hoặc ngụ ý bởi thao tác của người dùng đối với các biểu diễn đó. Việc chuyển đổi có thể được xác định (hoặc giới hạn bởi) kiến ​​thức của khách hàng về các loại phương tiện và cơ chế truyền thông tài nguyên, cả hai đều có thể được cải thiện nhanh chóng (ví dụ: mã theo yêu cầu).

[Thất bại ở đây ngụ ý rằng thông tin ngoài băng tần đang thúc đẩy sự tương tác thay vì siêu văn bản.]


không trả lời câu hỏi như chào mừng như những người khác, nhưng +1 cho thông tin có liên quan!
CybeX

Tôi nghĩ rằng điều này cũng trả lời câu hỏi, nhưng ví dụ như không trạng thái bị thiếu từ nó. Mọi ràng buộc đều quan trọng ... Phần loại phương tiện tiêu chuẩn không phải lúc nào cũng đúng. Ý tôi là có những lớp hiểu biết. Ví dụ: nếu bạn sử dụng RDF, thì loại phương tiện có thể được hiểu, nhưng ý nghĩa của nội dung thì không. Vì vậy, khách hàng cần phải biết từ vựng là tốt. Một số người đang thử nghiệm loại API REST này và một từ vựng REST chung để mô tả các siêu liên kết, v.v. hydra-cg.com
inf3rno

11

REST là một kiểu kiến ​​trúc dựa trên các tiêu chuẩn web và giao thức HTTP (được giới thiệu vào năm 2000).

Trong kiến ​​trúc dựa trên REST, mọi thứ đều là tài nguyên (Người dùng, Đơn hàng, Nhận xét). Một tài nguyên được truy cập thông qua một giao diện chung dựa trên các phương thức tiêu chuẩn HTTP (GET, PUT, PATCH, DELETE, v.v.).

Trong kiến ​​trúc dựa trên REST, bạn có một máy chủ REST cung cấp quyền truy cập vào các tài nguyên. Một máy khách REST có thể truy cập và sửa đổi các tài nguyên REST.

Mọi tài nguyên nên hỗ trợ các hoạt động chung HTTP. Tài nguyên được xác định bởi ID toàn cầu (thường là URI).

REST cho phép các tài nguyên có các biểu diễn khác nhau, ví dụ: văn bản, XML, JSON, v.v ... Máy khách REST có thể yêu cầu một biểu diễn cụ thể thông qua giao thức HTTP (đàm phán nội dung).

Phương thức HTTP:

Các phương thức PUT, GET, POST và DELETE được sử dụng điển hình trong các kiến ​​trúc dựa trên REST. Bảng dưới đây đưa ra lời giải thích về các hoạt động này.

  • GET xác định quyền truy cập đọc tài nguyên mà không có tác dụng phụ. Tài nguyên không bao giờ được thay đổi thông qua yêu cầu GET, ví dụ: yêu cầu không có tác dụng phụ (idempotent).
  • PUT tạo ra một tài nguyên mới. Nó cũng phải bình dị.
  • XÓA loại bỏ các tài nguyên. Các hoạt động là idempotent. Họ có thể được lặp đi lặp lại mà không dẫn đến kết quả khác nhau.
  • POST cập nhật một tài nguyên hiện có hoặc tạo một tài nguyên mới.

Một số trích dẫn, nhưng không phải là một nguồn duy nhất được đề cập. Bạn đã lấy cái này ở đâu vậy?
djvg

10

REST là viết tắt của chuyển trạng thái đại diện .

Nó dựa trên một giao thức truyền thông không thể lưu trữ, máy khách-máy chủ, không lưu trữ - và trong hầu hết mọi trường hợp, giao thức HTTP được sử dụng.

REST thường được sử dụng trong các ứng dụng di động, trang web mạng xã hội, công cụ mashup và quy trình kinh doanh tự động. Kiểu REST nhấn mạnh rằng sự tương tác giữa khách hàng và dịch vụ được tăng cường bằng cách giới hạn số lượng hoạt động (động từ). Tính linh hoạt được cung cấp bằng cách gán các tài nguyên (danh từ) các chỉ số tài nguyên phổ quát (URI) riêng của chúng.

Giới thiệu về phần còn lại


10

Nói chuyện không chỉ đơn giản là trao đổi thông tin . Một giao thức được thiết kế thực sự để không xảy ra nói chuyện. Mỗi bên đều biết công việc cụ thể của họ là gì vì nó được chỉ định trong giao thức. Các giao thức cho phép trao đổi thông tin thuần túy với chi phí có bất kỳ thay đổi nào trong các hành động có thể. Nói chuyện, mặt khác, cho phép một bên hỏi những hành động nào khác có thể được thực hiện từ bên kia. Họ thậm chí có thể hỏi cùng một câu hỏi hai lần và nhận được hai câu trả lời khác nhau, vì Nhà nước của bên kia có thể đã thay đổi tạm thời. Nói là kiến ​​trúc RESTful . Luận án của Fielding chỉ định kiến ​​trúc mà người ta sẽ phải tuân theo nếu muốn cho phép máy móc nói chuyện với nhau chứ không chỉ đơn giản làgiao tiếp .


10

Không có khái niệm như "lập trình RESTful" mỗi se. Nó sẽ được gọi là mô hình RESTful tốt hơn hoặc kiến ​​trúc RESTful thậm chí tốt hơn. Nó không phải là một ngôn ngữ lập trình. Đó là một mô hình.

Từ Wikipedia :

Trong điện toán, chuyển trạng thái đại diện (REST) ​​là một kiểu kiến ​​trúc được sử dụng để phát triển web.


9

Điểm còn lại là nếu chúng ta đồng ý sử dụng ngôn ngữ chung cho các hoạt động cơ bản (động từ http), cơ sở hạ tầng có thể được cấu hình để hiểu chúng và tối ưu hóa chúng đúng cách, ví dụ, bằng cách sử dụng các tiêu đề bộ đệm để thực hiện lưu trữ bộ đệm cấp độ.

Với thao tác GET được thực hiện đúng cách, sẽ không có vấn đề gì nếu thông tin đến từ DB máy chủ của bạn, memcache của máy chủ, CDN, bộ đệm của proxy, bộ đệm của trình duyệt hoặc bộ nhớ cục bộ của trình duyệt. Có thể sử dụng nguồn cập nhật nhanh nhất, sẵn có nhất có thể được sử dụng.

Nói rằng Rest chỉ là một thay đổi cú pháp từ việc sử dụng các yêu cầu GET với tham số hành động sang sử dụng các động từ http có sẵn làm cho nó trông giống như nó không có lợi ích và hoàn toàn là mỹ phẩm. Vấn đề là sử dụng một ngôn ngữ có thể được hiểu và tối ưu hóa bởi mọi phần của chuỗi. Nếu thao tác GET của bạn có hành động với các tác dụng phụ, bạn phải bỏ qua tất cả bộ đệm HTTP hoặc bạn sẽ có kết quả không nhất quán.


5
"Nói rằng Nghỉ ngơi chỉ là một thay đổi cú pháp ... làm cho nó có vẻ như không có lợi ích và hoàn toàn là mỹ phẩm" --- đó chính xác là lý do tại sao tôi đọc câu trả lời ở đây trên SO. Lưu ý rằng bạn đã không giải thích, tại sao REST không hoàn toàn là mỹ phẩm.
osa

5

Kiểm tra API là gì?

Kiểm tra API sử dụng lập trình để gửi các cuộc gọi đến API và nhận được kết quả. Nó kiểm tra liên quan đến phân khúc được thử nghiệm như một hộp đen. Mục tiêu của kiểm tra API là xác nhận thực hiện đúng và xử lý sai lầm của phần trước khi phối hợp thành một ứng dụng.

API REST

REST: Chuyển giao nhà nước đại diện.

  • Đó là sự sắp xếp các chức năng mà người kiểm tra thực hiện các yêu cầu và nhận phản hồi. Trong các tương tác API REST được thực hiện thông qua giao thức HTTP.
  • REST cũng cho phép giao tiếp giữa các máy tính với nhau qua mạng.
  • Để gửi và nhận tin nhắn, nó liên quan đến việc sử dụng các phương thức HTTP và nó không yêu cầu định nghĩa thông điệp nghiêm ngặt, không giống như các dịch vụ Web.
  • Các thông báo REST thường chấp nhận biểu mẫu dưới dạng XML hoặc Ký hiệu đối tượng JavaScript (JSON).

4 Phương thức API thường được sử dụng: -

  1. NHẬN: - Nó cung cấp quyền truy cập chỉ đọc vào một tài nguyên.
  2. POST: - Nó được sử dụng để tạo hoặc cập nhật một tài nguyên mới.
  3. PUT: - Nó được sử dụng để cập nhật hoặc thay thế một tài nguyên hiện có hoặc tạo một tài nguyên mới.
  4. XÓA: - Nó được sử dụng để loại bỏ một tài nguyên.

Các bước để kiểm tra API theo cách thủ công: -

Để sử dụng API theo cách thủ công, chúng tôi có thể sử dụng các trình cắm API REST dựa trên trình duyệt.

  1. Cài đặt plugin POSTMAN (Chrome) / REST (Firefox)
  2. Nhập URL API
  3. Chọn phương thức REST
  4. Chọn tiêu đề nội dung
  5. Nhập yêu cầu JSON (POST)
  6. Bấm vào gửi
  7. Nó sẽ trả về phản hồi đầu ra

Các bước để tự động hóa API REST


5
đây không phải là ngay cả một câu trả lời thích hợp
therealprashant

5

Điều này rất ít được đề cập ở khắp mọi nơi, nhưng Mô hình trưởng thành của Richardson là một trong những phương pháp tốt nhất để thực sự đánh giá API của Restful như thế nào. Thêm về nó ở đây:

Mô hình trưởng thành của Richardson


Nếu bạn nhìn vào các ràng buộc Fielding đưa vào REST, bạn sẽ thấy rõ rằng một API cần phải đạt đến Lớp 3 của RMM để được xem là RESTful, mặc dù điều này thực sự không đủ vì vẫn còn đủ khả năng để thất bại Ý tưởng REST - tách rời các máy khách khỏi API máy chủ. Chắc chắn, Lớp 3 đáp ứng các ràng buộc HATEOAS nhưng vẫn dễ dàng phá vỡ các yêu cầu và kết nối chặt chẽ các máy khách với máy chủ (tức là bằng cách sử dụng các tài nguyên đã nhập)
Roman Vottner

2

Tôi muốn nói rằng một khối xây dựng quan trọng trong việc hiểu REST nằm ở các điểm cuối hoặc ánh xạ, chẳng hạn như /customers/{id}/balance.

Bạn có thể tưởng tượng một điểm cuối như là đường ống kết nối từ trang web (front-end) đến cơ sở dữ liệu / máy chủ của bạn (back-end). Sử dụng chúng, front-end có thể thực hiện các hoạt động back-end được xác định trong các phương thức tương ứng của bất kỳ ánh xạ REST nào trong ứng dụng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.