Những độc giả mới tham gia chủ đề này sẽ bị ấn tượng bởi cuộc thảo luận bất tận về những gì bạn nên làm và sự vắng mặt tương đối của các bài học từ kinh nghiệm. Thực tế là REST được "ưu tiên" hơn SOAP, tôi cho rằng, việc học hỏi kinh nghiệm ở cấp độ cao, nhưng lòng tốt chúng ta có phải đã tiến bộ từ đó không? Đó là năm 2016. Luận án của Roy là vào năm 2000. Chúng ta đã phát triển những gì? Có vui không? Có dễ dàng để tích hợp với? Hỗ trợ? Nó sẽ xử lý sự gia tăng của điện thoại thông minh và kết nối di động không ổn định?
Theo ME, mạng thực tế là không đáng tin cậy. Yêu cầu thời gian chờ. Các kết nối được thiết lập lại. Mạng đi xuống hàng giờ hoặc nhiều ngày tại một thời điểm. Xe lửa đi vào đường hầm với người dùng di động trên tàu. Đối với bất kỳ yêu cầu nào (như thỉnh thoảng được thừa nhận trong tất cả các cuộc thảo luận này), yêu cầu có thể rơi xuống nước trên đường đi hoặc phản hồi có thể rơi xuống nước trên đường trở về. Trong các điều kiện này, việc đưa ra các yêu cầu PUT, POST và DELETE trực tiếp chống lại các tài nguyên thực sự luôn khiến tôi cảm thấy hơi tàn bạo và ngây thơ.
HTTP không làm gì để đảm bảo hoàn thành đáng tin cậy cho phản hồi yêu cầu và điều đó thật tốt vì đây là công việc của các ứng dụng nhận biết mạng. Phát triển một ứng dụng như vậy, bạn có thể chuyển qua các vòng để sử dụng PUT thay vì POST, sau đó nhiều vòng hơn để đưa ra một loại lỗi nhất định trên máy chủ nếu bạn phát hiện các yêu cầu trùng lặp. Quay lại máy khách, sau đó bạn phải nhảy qua các vòng để diễn giải các lỗi này, tải lại, xác nhận lại và đăng lại.
Hoặc bạn có thể làm điều này : coi các yêu cầu không an toàn của bạn là tài nguyên người dùng đơn lẻ phù hợp (hãy gọi chúng là hành động). Khách hàng yêu cầu một "hành động" mới trên một tài nguyên thực sự với một POST trống cho tài nguyên. POST sẽ chỉ được sử dụng cho việc này. Khi đã sở hữu URI một cách an toàn cho hành động mới được tạo ra, khách hàng PUT yêu cầu không an toàn đối với URI hành động, chứ không phải tài nguyên đích . Giải quyết hành động và cập nhật tài nguyên "thực" là công việc chính xác của API của bạn và ở đây được tách ra khỏi mạng không đáng tin cậy.
Máy chủ thực hiện công việc, trả về phản hồi và lưu trữ theo URI hành động đã thỏa thuận . Nếu có lỗi xảy ra, máy khách sẽ lặp lại yêu cầu (hành vi tự nhiên!) Và nếu máy chủ đã nhìn thấy nó, nó sẽ lặp lại phản hồi được lưu trữ và không làm gì khác .
Bạn sẽ nhanh chóng phát hiện ra sự tương đồng với những lời hứa: chúng tôi tạo và trả lại chỗ giữ chỗ cho kết quả trước khi làm bất cứ điều gì. Cũng giống như một lời hứa, một hành động có thể thành công hoặc thất bại một lần, nhưng kết quả của nó có thể được tìm nạp nhiều lần.
Trên hết, chúng tôi cho phép gửi và nhận ứng dụng một cơ hội để liên kết hành động được xác định duy nhất với tính duy nhất trong môi trường tương ứng của chúng. Và chúng tôi có thể bắt đầu yêu cầu và thực thi!, Hành vi có trách nhiệm từ khách hàng: lặp lại yêu cầu của bạn bao nhiêu tùy thích, nhưng đừng tạo ra một hành động mới cho đến khi bạn sở hữu kết quả dứt khoát từ kết quả hiện có.
Như vậy, nhiều vấn đề gai góc biến mất. Các yêu cầu chèn lặp đi lặp lại sẽ không tạo ra các bản sao và chúng tôi không tạo tài nguyên thực sự cho đến khi chúng tôi sở hữu dữ liệu. (các cột cơ sở dữ liệu có thể ở mức không rỗng). Yêu cầu cập nhật lặp lại sẽ không đạt trạng thái không tương thích và sẽ không ghi đè các thay đổi tiếp theo. Khách hàng có thể (tải lại) và xử lý liền mạch xác nhận ban đầu vì bất kỳ lý do gì (máy khách bị lỗi, phản hồi bị mất, v.v.).
Các yêu cầu xóa liên tiếp có thể xem và xử lý xác nhận ban đầu mà không gặp lỗi 404. Nếu mọi thứ mất nhiều thời gian hơn dự kiến, chúng tôi có thể trả lời tạm thời và chúng tôi có một nơi mà khách hàng có thể kiểm tra lại kết quả cuối cùng. Phần đẹp nhất của mẫu này là thuộc tính Kung-Fu (Panda). Chúng tôi có một điểm yếu, xu hướng để khách hàng lặp lại yêu cầu bất cứ khi nào họ không hiểu phản hồi và biến nó thành một điểm mạnh :-)
Trước khi nói với tôi đây không phải là RESTful, vui lòng xem xét nhiều cách mà các nguyên tắc REST được tôn trọng. Khách hàng không xây dựng URL. API vẫn có thể khám phá, mặc dù có một chút thay đổi về ngữ nghĩa. Động từ HTTP được sử dụng một cách thích hợp. Nếu bạn nghĩ rằng đây là một thay đổi lớn để thực hiện, tôi có thể nói với bạn từ kinh nghiệm rằng nó không phải.
Nếu bạn nghĩ rằng bạn sẽ có một lượng dữ liệu khổng lồ để lưu trữ, hãy nói về khối lượng: một xác nhận cập nhật điển hình là một phần của một kilobyte. HTTP hiện cung cấp cho bạn một hoặc hai phút để trả lời dứt khoát. Ngay cả khi bạn chỉ lưu trữ các hành động trong một tuần, khách hàng vẫn có nhiều cơ hội để bắt kịp. Nếu bạn có âm lượng rất lớn, bạn có thể muốn lưu trữ giá trị khóa tuân thủ axit chuyên dụng hoặc giải pháp trong bộ nhớ.