2012-08-14 44 views
32

Tôi có một url để lấy hẹn cho một người sử dụng như thế này:Đi qua mảng trong GET cho một cuộc gọi REST

/user/:userId/appointments 

Làm thế nào url nên xem xét như thế nào nếu tôi muốn nhận được các cuộc hẹn cho nhiều người dùng?

nó nên là:

/appointments?users=1d1,1d2.. 

Cảm ơn, Chris.

Trả lời

43

Bộ sưu tập là tài nguyên do đó/cuộc hẹn là tốt như tài nguyên.

Bộ sưu tập thường cung cấp các bộ lọc thông qua chuỗi truy vấn về bản chất là những gì người dùng = id1, id2 ... là.

Vì vậy,

/appointments?users=id1,id2 

là tốt như một nguồn tài nguyên RESTful lọc.

1
/appointments?users=1d1,1d2.. 

là tốt. Đó là khá nhiều lựa chọn hợp lý duy nhất của bạn kể từ khi bạn không thể vượt qua trong một cơ thể với một GET.

6

Tôi nghĩ rằng đó là một thực hành tốt hơn để serialize các thông số cuộc gọi REST của bạn, thường là bằng JSON mã hóa chúng:

/appointments?users=[id1,id2] 

hoặc thậm chí:

/appointments?params={users:[id1,id2]} 

Sau đó, bạn bỏ mã hóa chúng trên máy chủ . Điều này sẽ giúp bạn linh hoạt hơn trong thời gian dài.

Chỉ cần đảm bảo URL cũng sẽ kích hoạt các thông số trước khi bạn gửi chúng!

+2

? {Người dùng: [id1, id2]} không tuân thủ quy ước thông số chuỗi truy vấn của? Key1 = val2 & key2 = val2. – bryanmac

+0

bắt tốt! chỉnh sửa để sửa chữa ... – sgress454

+1

Ngoài ra, bạn có ví dụ về các dịch vụ chính cung cấp các đối tượng được tuần tự hóa trong các bộ lọc chuỗi truy vấn không? Từ những gì tôi đã nhìn thấy hầu hết cung cấp các bộ lọc đơn giản của các tùy chọn phân cách bằng dấu phẩy hoặc các định dạng truy vấn như OData – bryanmac

-1

Thay vì sử dụng http GET, hãy sử dụng http POST. Và JSON. Hoặc XML

Đây là cách yêu cầu luồng của bạn tới máy chủ sẽ như thế nào.

POST /appointments HTTP/1.0 
Content-Type: application/json 
Content-Length: (calculated by your utility) 

{users: [user:{id:id1}, user:{id:id2}]} 

Hoặc trong XML,

POST /appointments HTTP/1.0 
Content-Type: application/json 
Content-Length: (calculated by your utility) 

<users><user id='id1'/><user id='id2'/></users> 

Bạn chắc chắn có thể tiếp tục sử dụng GET như bạn đã đề xuất, vì nó chắc chắn là đơn giản hơn.

/appointments?users=1d1,1d2 

Điều này có nghĩa là bạn sẽ phải giữ cấu trúc dữ liệu của mình rất đơn giản.

Tuy nhiên, nếu/khi cấu trúc dữ liệu của bạn trở nên phức tạp hơn, http GET và không có JSON, lập trình và khả năng nhận ra dữ liệu của bạn sẽ rất khó khăn.

Do đó, trừ khi bạn có thể giữ cấu trúc dữ liệu của mình đơn giản, tôi khuyên bạn nên áp dụng khung chuyển dữ liệu. Nếu các yêu cầu của bạn dựa trên trình duyệt, thực hành thông thường của ngành là JSON. Nếu các yêu cầu của bạn là server-server, hơn XML là khung công tác thuận tiện nhất.

JQuery

Nếu khách hàng của bạn là một trình duyệt và bạn không sử dụng GWT, bạn nên xem xét sử dụng jquery REST. Google trên các dịch vụ RESTful với jQuery.

+5

Tôi không nghĩ rằng đây là cách chính xác để đi về nó. Bạn đang BẮT ĐẦU một tài nguyên không POST một tài nguyên mới. –

+1

Tôi không nghĩ rằng bạn hiểu được việc sử dụng GET/POST của http. Chúng không phù hợp với ý nghĩa từ điển tiếng Anh cho những từ đó. POST là khi cố gắng GET nhưng với các đối số không được đặt không có trong url nhưng trong luồng io. –

+1

Rất khó hiểu khi có ai đó hiểu biết đầy đủ về phương thức POST, nhưng tùy thuộc vào ý nghĩa từ điển tiếng Anh, để bỏ phiếu cho tôi. Bạn không thể đổ lỗi cho tôi cho các quyết định cú pháp được thực hiện bởi những người đã chọn để xác định nó theo cách đó. Đừng giết sứ giả. –

3

Một cách khác để làm điều đó, có thể có ý nghĩa tùy thuộc vào kiến ​​trúc máy chủ/khung lựa chọn của bạn, là lặp lại cùng một đối số lặp đi lặp lại. Một cái gì đó như thế này:

/appointments?users=id1&users=id2 

Trong trường hợp này, tôi khuyên bạn nên sử dụng tên tham số trong số ít:

/appointments?user=id1&user=id2 

này được hỗ trợ natively bởi các khuôn khổ như Jersey (cho Java). Hãy xem this question để biết thêm chi tiết.

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