2012-12-09 35 views
7

Tôi đang thiết kế API RESTful.Cách thiết kế REST URI cho nhiều tham số khóa-giá trị của HTTP GET

Một dịch vụ sẽ cung cấp chức năng truy vấn cho nhiều cặp khóa-giá trị. Ví dụ, khách hàng có thể truy vấn với một yêu cầu HTTP GET cho các sản phẩm khác nhau và số lượng liên quan.

Các khách hàng muốn truy vấn sản phẩm 1 với số tiền 44 VÀ sản phẩm 2 với số tiền 55. Tôi thực sự không muốn URI của tôi trông như thế này:

/produkt?productId1=1&productquantity1=44&productId2=2&productquantity2=55 

bởi vì tôi không biết có bao nhiêu sản phẩm được truy vấn.

Hoặc như thế này:

/produkt?product=1,44&product=2,55 

vì thế khách hàng có thể biết rằng trước khi các dấu phẩy có là productId và sau dấu phẩy số lượng.

Có ai có giải pháp khác không? Hoặc là nó không RESTful để cung cấp khả năng truy vấn nhiều sản phẩm với một yêu cầu? Tốt hơn là cung cấp khả năng truy vấn chỉ một sản phẩm có số lượng được liên kết và nếu khách hàng muốn truy vấn nhiều sản phẩm hơn, họ phải gửi thêm yêu cầu?

+0

điều gì sẽ xảy ra với việc đặt thông tin truy vấn vào bài đăng http? – schippi

+2

@schippi Không có gì, ngoại trừ việc không được RESTful :) – dasblinkenlight

+0

Dịch vụ web RESTful không nhất thiết phải dựa trên GET.Bạn có thể dễ dàng có một dịch vụ RESTful đòi hỏi việc truyền tải nhiều dữ liệu hơn có thể được bao gồm trong một yêu cầu GET. Việc sử dụng bất kỳ phương thức HTTP nào cũng hợp lý. Xem: http://en.wikipedia.org/wiki/Representational_state_transfer#Vocabulary_re-use_vs._its_arbitrary_extension:_HTTP_and_SOAP – Michael

Trả lời

2

Tôi sẽ mở rộng đề xuất thứ hai của bạn bằng cách thêm tên rõ ràng cho các phần của sản phẩm và sử dụng dấu chấm phẩy thay cho dấu phẩy để phân tách các thuộc tính sản phẩm, vì thứ tự không quan trọng *.

/products?id=1;qty=44&qty=55;id=2 

Lưu ý cách idqty được chuyển xung quanh cho các sản phẩm thứ hai, bởi vì thứ tự các thuộc tính không quan trọng.


* Có quy ước sử dụng dấu phẩy khi thứ tự quan trọng và dấu chấm phẩy khi đơn hàng không quan trọng.

+0

Tôi có thể tiêm các tham số đó vào Dịch vụ REST của mình bằng cách nào? Tôi biết, tôi phải sử dụng @ QueryParam-Annotation, nhưng làm thế nào tôi nên sử dụng điều này? – joshi737

5

Dưới đây là một ý tưởng để vượt qua một tham số:

/products?productDetail=[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

nơi

[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

là một đại diện JSON của lớp List<kv>

class kv { 
    String key; 
    String value; 


    public kv(String key, String value) { 
     super(); 
     this.key = key; 
     this.value = value; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

để bạn có thể dễ dàng chuyển đổi tham số truy vấn productDetail in to List<kv> sử dụng

new Gson().fromJson(productDetail,kv.class); 

hơn bạn có thể dễ dàng lặp lại tất cả các yếu tố.

Một đề xuất khác là, nếu bạn không biết số lượng sản phẩm được truy vấn thì hãy sử dụng yêu cầu POST cho việc này.

+0

Giống như ý tưởng này, tôi sẽ xem xét việc đặt (truy vấn nên là idempotent) JSON, thay vì sử dụng truy vấn GET. – Stefan

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