2015-03-12 13 views
5

Tôi đã viết ứng dụng ReST dựa trên JAX-RS bằng cách sử dụng Apache Wink và tôi hiểu khái niệm liên kết giữa các tham số đường dẫn với lớp xử lý tài nguyên. Ở đây tôi thấy rằng, Chúng ta có thể định nghĩa các đường dẫn bằng cách sử dụng chú thích @Path và tài nguyên tương ứng sẽ được gọi dựa trên phương thức HTTP ..Cách viết tài nguyên JAX-RS đơn cho số biến số tham số đường dẫn

Bây giờ tôi đang xem một thứ như tài nguyên sẽ được gọi cho số biến của các tham số đường dẫn.

Ví dụ Tôi muốn lớp tài nguyên đơn lẻ của mình CollegeResource nên được gọi cho URI như /rest/college, /rest/college/subject, /rest/college/subject/teachers, và có thể đi tới bất kỳ số tham số đường dẫn nào.

Nếu tôi biết số tham số đường dẫn trước đó, tôi có thể đạt được điều này bằng cách sử dụng một cái gì đó như thế này /rest/college/{param1}/{param2}. Nhưng số lượng tham số đường dẫn không xác định. Vì vậy, tôi cảm thấy (tôi có thể sai) không thể sử dụng phương pháp này.

Một cách khác mà tôi vẫn có thể sử dụng là sử dụng tham số truy vấn. Nhưng tôi muốn điều này có sẵn để chỉ là tham số đường dẫn.

Có cách nào để thực hiện việc này bằng cách sử dụng nháy mắt apache với bất kỳ cấu hình nào khác không? Nếu không có trong nháy mắt Apache, bất kỳ triển khai JAX-RS nào khác đều hỗ trợ điều này?

Trả lời

7

Bạn có thể sử dụng regex, như @Path("/college/{param: .*}"), sau đó sử dụng List<PathSegment> làm thông số phương pháp. Ví dụ

@GET 
@Path("/college/{params: .*}") 
public Response get(@PathParam("params") List<PathSegment> params) { 
    StringBuilder builder = new StringBuilder(); 
    for (PathSegment seg: params) { 
     builder.append(seg.getPath()); 
    } 
    return Response.ok(builder.toString()).build(); 
} 

C:\>curl -v http://localhost:8080/college/blah/hello/world/cool
Kết quả:blahhelloworldcool

Nhưng cá nhân tôi, tôi sẽ tránh xa loại điều. Đường dẫn URI của bạn (mẫu) nên có một số ý nghĩa ngữ nghĩa. Cho phép một số tham số đường dẫn tùy ý, có thể không có bất kỳ ý nghĩa nào, là lỗi dễ xảy ra và IMO, là nguyên nhân cho việc thiết kế lại. Tôi sẽ cần phải biết ngữ nghĩa đằng sau sự lựa chọn thiết kế này trước khi tôi có thể đưa ra bất kỳ lời khuyên nào.

+0

Tôi đang xem xét, khi tôi gọi RDBMS, tôi sẽ gửi 3 đối tượng (databasename, tên lược đồ và tên bảng) trong thông số đường dẫn. URL của tôi sẽ giống như **/api/database/dbname/schemaName/tablename **. Nhưng trong khi tôi đang gọi Salesforce.com, tôi sẽ chỉ gửi một đối tượng SFDC và URL của tôi sẽ là **/api/sfdc/Tài khoản **. Ở đây tôi không muốn có nhiều tài nguyên cho mỗi ứng dụng đích. Vì vậy, tôi muốn có một tài nguyên duy nhất với URI cơ sở/api/{targetAppName} và điều này có thể có bất kỳ số tham số đường dẫn nào. Tôi có thể truy cập {targetAppName} trong mã & quyết định ứng dụng đích và thực hiện các công việc phù hợp. –

+0

Và bạn chỉ muốn có một phương pháp tài nguyên để xử lý tất cả các trường hợp sử dụng có thể? Nếu đó là những gì bạn muốn, sau đó đi cho nó –

+0

Hoạt động. Nói cuối cùng cho chủ đề này, bằng cách sử dụng {params:. *}, Chúng ta có thể làm cho nó chung chung. –

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