2015-09-07 15 views
8

Tôi đang tìm kiếm các thông lệ tốt nhất về thiết kế API RESTful đối với trường hợp sử dụng sau đây:chìa khóa composite cho các phương pháp REST API

Object miền xe:

class Vehicle { 
    private String vehicleType; 
    private String colour; 
    private String transmission; 
    private String yearOfIssue; 
} 

Một đối tượng dụ:

Vehicle = {vehicleType : 'Car', colour : 'Red', transmission : 'Automatic', yearOfIssue : '2008'}; 

Trong mô hình miền này, không có trường duy nhất định danh duy nhất (ví dụ: vehicleId), mà là tất cả các trường của đối tượng cùng tạo thành khóa chính (ràng buộc này có trong lớp cơ sở dữ liệu) .

Chúng tôi không có sự linh hoạt để thay đổi mô hình miền này để thêm một định danh duy nhất của trường. Vì vậy, câu hỏi của tôi là như sau - Nếu tôi muốn thêm một API REST đơn giản trên đầu của đối tượng miền này cung cấp chức năng đơn giản để TẠO, CẬP NHẬT, DELETE và GET Xe, thực hành tốt nhất cho các điểm cuối PATH cho là gì những phương pháp này?

Tiếp theo ví dụ trên, nếu mô hình miền là để có một trường duy nhất định danh duy nhất vehicleId, sau đó tôi có thể tưởng tượng các điểm cuối sau:

GET /vehicles/:vehicleId 
PUT /vehicles/:vehicleId 
DELETE /vehicles/:vehicleId 

Tôi không biết của một mô hình tồn tại tương tự như điều này cho các phím tổng hợp dưới dạng:

GET /vehicles/:vehicleTypecolourtransmissionyearOfIssue 
GET /vehicles/CarRedAutomatic2008 

có vẻ không chính xác.

Bất kỳ lời khuyên nào về mẫu tốt để tuân theo trường hợp sử dụng này sẽ được đánh giá cao.

Cảm ơn

Trả lời

4

Theo tiêu chuẩn REST chung, mỗi điểm cuối trưng ra tài nguyên và khách hàng có thể làm việc với chúng bằng động từ http. Trong ví dụ này, tài nguyên của bạn là phương tiện và máy khách đang tìm nạp dữ liệu từ máy chủ bằng GET. Lý tưởng nhất, mỗi tài nguyên cần được xác định duy nhất với một khóa duy nhất (duy nhất).

Nhưng tài nguyên (phương tiện) của bạn không có khóa duy nhất giá trị duy nhất và không thể thay đổi trong hệ thống! Trong trường hợp này bạn vẫn có thể thực hiện cuộc gọi GET với tất cả các thông số cần thiết để xác định các nguồn lực, giống như bất kỳ cuộc gọi http tiêu chuẩn khác, như

GET /vehicles?type=Car&color=Red&transmission=Automatic&manufactureYear=2008 

Công nghệ/nền tảng mà bạn đang sử dụng, nếu điều đó cho phép thực hiện các tuyến đường tùy chỉnh cho bạn phương pháp, bạn có thể tạo ra một cái gì đó lộ trình tùy chỉnh như

new route("/vehicles/{type}/{color}/{transmission}/{manufactureYear}") 

Và gọi dịch vụ của bạn như

GET /vehicles/Car/Red/Automatic/2008 

Những điều tốt về điều này, uri của bạn trở nên ngắn hơn . Nhưng mặt khác [1] Đối với tất cả các phương pháp/tài nguyên thuộc loại này, bạn sẽ phải tạo các tuyến tùy chỉnh và [2] uri này không có ý nghĩa nhiều trừ khi bạn có kiến ​​thức về phương pháp và lộ trình cụ thể.

+3

Sử dụng đường dẫn tốt hơn thông số để chỉ định khóa, vì nó hoạt động với bất kỳ động từ nào. Ví dụ FOr bạn có thể cập nhật bằng cách sử dụng 'POST/vehicle/Car/Red/Automatic/2008' –

+0

@JohnHenckel theo http://tools.ietf.org/html/rfc3986#section-3.4, các tham số truy vấn là một phần của URL và do đó bạn cũng có thể POST cho chúng. xem https://stackoverflow.com/a/20637055/214446 – mb21

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