2013-06-24 30 views
8

Chúng ta có thể tạo cùng một GET URI nhưng với các tham số truy vấn khác nhau không?Hai phương thức GET với các tham số truy vấn khác nhau: REST

Ví dụ: Tôi có hai REST của GET URI:

/questions/ask/?type=rest 
/questions/ask/?byUser=john 

Bây giờ dịch vụ REST không nhận ra hai phương pháp GET như riêng biệt và coi đó chỉ có 1 phương thức GET được khai báo là đầu tiên.

  1. tại sao nó hoạt động theo cách này?
  2. Có cách nào để tôi có thể thực hiện hai phương thức GET có các Tham số Truy vấn khác nhau không?

Nó sẽ được đánh giá cao nếu bạn có thể báo giá bất kỳ tài nguyên nào.

Trả lời

16

Vì tài nguyên được xác định duy nhất bởi PATH (và không phải bởi thông số của nó). Hai tài nguyên bạn xác định có cùng PATH.

@Path("https://stackoverflow.com/questions/ask") 

Theo JSR-311 spec:

phương pháp như vậy, được gọi là phương pháp tiểu tài nguyên, được đối xử như một phương pháp tài nguyên bình thường (xem phần 3.3) trừ phương pháp chỉ gọi cho yêu cầu Các URI khớp với mẫu URI được tạo bằng cách ghép nối mẫu URI của lớp tài nguyên với mẫu URI của phương thức .

Kể từ mô hình dữ liệu của bạn bao gồm hai nguồn riêng biệt Tôi đề nghị làm hai phương pháp còn lại với con đường khác nhau:

@Path("https://stackoverflow.com/questions/ask/type") 
@Path("https://stackoverflow.com/questions/ask/user") 

Đây là cách RESTful, vì một URI đại diện cho một và chỉ một tài nguyên và cần có không quá tải. Nếu một URI đại diện cho nhiều hơn một tài nguyên có nghĩa là bạn đã sai nó ở đâu đó.

+0

điều này cũng đúng khi bạn có số tham số truy vấn khác nhau trong các phương pháp? Ý tôi là, nếu tôi có hai phương thức còn lại được chú thích bằng '@ GET' với cùng một chữ ký ngoại trừ phương thức đầu tiên nhận 2 tham số truy vấn và phương thức thứ hai lấy 3 tham số truy vấn. Vì vậy, ngay cả khi tôi acll phần còn lại điểm cuối với 3 params, phương pháp đầu tiên sẽ chỉ được gọi là? –

3

Bạn không thể OverloadREST yêu cầu.

Trong lớp doanh nghiệp của bạn, bạn sẽ phải kiểm tra xem hai biến nào được đặt và sau đó bạn sẽ phải thực hiện xử lý yêu cầu.

+0

bạn có thể giải thích thêm về câu này: "Trong lớp doanh nghiệp của bạn, bạn sẽ phải kiểm tra xem" hai biến "nào được đặt và sau đó bạn sẽ phải thực hiện Chế biến." – ritesh

+0

Yêu cầu REST của bạn phải có 'type' và' byUser'. Bạn có thể có 'DefaultValue'. Tôi giả sử bạn đang gọi phương thức khác nhau hoặc thực hiện xử lý khác nhau tùy thuộc vào những gì được thiết lập. Trong lớp kinh doanh của tôi, tôi kiểm tra xem cái nào trong hai được thiết lập và gọi phương thức cụ thể đó. HOẶC bạn có thể đi cho hai REST URI khác nhau. – JHS

+0

Tôi đang tạo hai phương thức là getQuestionByType (@QueryParam ("type")) và getQuestionByUser (@QueryParam ("byUser")). Vì vậy, trong lớp kinh doanh làm thế nào bạn sẽ kiểm tra cái nào trong hai được thiết lập và gọi phương thức cụ thể đó? – ritesh

5

Bạn không thể có hai getters với cùng một uri nhưng các thông số yêu cầu khác nhau. Những gì bạn có thể làm là có một phương thức getter với nhiều tham số yêu cầu.

@RequestMapping(value = "uri", method = RequestMethod.GET) 
public String test(@RequestParam String type, @RequestParam String byUser) 

sau đó gọi nó với hai tham số

/questions/ask/?type=rest&byUser=john 

Bạn cần phải xử lý logic bên trong phương pháp kiểm tra để xử lý các thông số cho phù hợp.

Về Darijan, tôi nghĩ rằng đó là quyết định đi với hai phương pháp hoặc một phương pháp xem xét những gì các logic gạch dưới. Nếu bạn đang đi với 2 phương pháp sau đó sử dụng hai uri.Nếu logic kinh doanh là ok để đi với một uri sau đó sử dụng cách tôi trả lời

+0

Điều gì sẽ xảy ra nếu tôi muốn chuyển bất kỳ kết hợp nào của hai tham số này, chỉ nói loại, byUser only, type và byUser như bạn đã đề cập sau đó nó sẽ hoạt động, đúng không? – ritesh

+0

Nó sẽ, bạn chỉ cần kiểm tra xem các thông số khác bằng với 'null'. Nhưng đó không phải là "cách REST". – darijan

+0

Thnaks darijan và Sanjaya! nhưng hãy cho tôi biết cách để chấp nhận hai câu trả lời. darijan đã trả lời một phần câu hỏi và Sanjaya & Junaid đã trả lời một phần khác. Hãy giúp tôi ra. :) – ritesh

0

Bạn có thể quá tải điểm cuối còn lại trong điều khoản của yêu cầu/tham số truy vấn có mặt trong yêu cầu. Đây là câu trả lời đã giải quyết trường hợp sử dụng của tôi: create two method for same url pattern with different arguments

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi – afxentios

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