2012-05-18 26 views
6

Tôi muốn API của mình có yêu cầu chỉ xác thực. Ví dụ: nếu tôi có URL chẳng hạn như:API RESTful: Kết hợp METHOD/HEADER nào chỉ được sử dụng cho xác thực

http://api.somesite.com/users/12345 

và người dùng điền thông tin về khách hàng mà tôi cuối cùng sẽ PATCH/PUT/POST vào tài nguyên đó. Khi người dùng điền vào biểu mẫu, tôi có thể gửi qua đại diện được cập nhật từng phần của họ qua máy chủ định kỳ để tôi có thể hiển thị xác thực thời gian thực của đầu vào (ví dụ: "Tên người dùng đó đã được dùng", "Mật khẩu đó là quá ngắn").

Không có tiêu chuẩn HTTP METHOD hoặc HEADER dường như cho phép hành vi này trên cùng một tài nguyên đó. Có vẻ như lựa chọn của tôi là:

  1. Tạo một tài nguyên trực thuộc mới để xác nhận
  2. Sử dụng một tiêu đề tùy chỉnh (x-somesite-validation chỉ-) và PUT chỉ ra rằng tôi muốn xác nhận nhưng không lưu
+0

câu hỏi liên quan: http : //stackoverflow.com/questions/8368931/how-should-i-design-a-restful-url-to-validate-an-object – suing

+0

Câu hỏi hay. Chỉ cần chạy vào vấn đề này quá, và tôi đang tranh luận giữa hai cách tiếp cận chính xác giống nhau. Dựa vào tiêu đề cá nhân. Lấy cảm hứng từ tham số '--dry-run' của git trong nhiều lệnh của nó. –

Trả lời

2

Một số tùy chọn

1) Sử dụng tùy chỉnh tiêu đề
2) Đặt một cái gì đó trong chuỗi truy vấn cho thấy để xác thực chỉ
3) Sử dụng Action URl ví dụ \ IndividualClient \ 123 \ actions \ Validate \ Invoke {section 19 tại đây http://restfulobjects.files.wordpress.com/2011/11/restful-objects-spec-052.pdf}
4) URL phân cấp, ví dụ: \ IndividualClient \ 123 \ Validation

Từ post này tôi thấy lời khuyên này

Do sử dụng POST bất cứ khi nào bạn cần phải làm điều gì đó mà cảm thấy RPC-như Đỗ sử dụng GET cho những thứ như tính toán, trừ khi đầu vào của bạn là lớn, trong trường hợp nào sử dụng POST

Đối với câu hỏi cụ thể của bạn, POST nên được sử dụng cho # 4 và # 5. Các hoạt động này rơi> theo hướng dẫn "giống như RPC" ở trên. Đối với # 5, hãy nhớ rằng POST không nhất thiết phải> sử dụng Content-Type: application/x-www-form-urlencoded. Điều này có thể dễ dàng là một tải trọng JSON hoặc CSV.

Dưới đây là những gì tôi đang xem xét:

Đây là tiện ích của một tài nguyên:
user/xác nhận
POST
Yêu cầu: UserResource
đáp ứng: ValidationResult
đáp ứng Codes 200, 400. 404.500

Đây là bản cập nhật của một tài nguyên
user/204/xác nhận
POST
Yêu cầu: UserResource,
đáp ứng: ValidationResult đáp ứng Codes 200, 400. 404. 500

+0

Tôi đã kết thúc việc thực hiện một cái gì đó rất giống với điều này, nhưng vì lợi ích của việc không viết lại bộ định tuyến phần mềm của tôi, tôi chỉ làm cho nó trở thành một phần của chuỗi truy vấn: POST/user/204? – Fleep

0

Tùy chọn thối sẽ là triển khai chức năng xác nhận trên máy khách. Chức năng này sau đó sẽ gửi yêu cầu cụ thể khi cần thông tin cụ thể.

Ví dụ: bạn không thực sự cần gửi yêu cầu kiểm tra xem mật khẩu có quá ngắn hay không. Nhưng bạn có thể gửi một yêu cầu duy nhất để kiểm tra xem tên người dùng có tồn tại không.

Đây là cách xác nhận được thực hiện với Ajax, mà btw đang sử dụng RESTful API (HTTP) :)

+1

Tôi cho rằng AJAX nhất thiết phải sử dụng HTTP làm giao thức truyền, nhưng không nhất thiết phải triển khai thực hành RESTful dưới dạng API * theo cách có ý nghĩa *. Nói "tất cả HTTP là RESTful" bỏ lỡ điểm. – Fleep

+0

Ngoài ra, tôi sẽ xác thực ở phía máy chủ, và vì không lặp lại chính mình, tôi muốn có thể giữ mã xác nhận của mình được chuẩn hóa và ở một nơi duy nhất. Xác thực thời gian thực tác động đến giao diện người dùng, như xác thực mật khẩu, sẽ hoạt động tốt với xác thực mỏng, không quan trọng ở phía máy khách. Nhưng nó không phải là một sự thay thế cho những gì tôi yêu cầu ở trên. – Fleep

+0

Đó là gấp đôi số lượng công việc phát triển (tức là ở phía khách hàng và máy chủ). – Pierre

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