2016-03-07 16 views
12

Cách thích hợp để khai báo tham số truy vấn tùy chọn, với giá trị mặc định, khi sử dụng compojure-api là gì?Tham số truy vấn tùy chọn (có giá trị mặc định) với compojure-api

Một trong những yếu tố con đường của tôi là như sau (sau khi đọc this):

(GET "/:id/descendants" [id] 
    :return [d/CategoryTreeElement] 
    :path-params [id :- Long] 
    :query-params [context-type :- d/ContextType 
        levels :- Integer 
        {tenant :- d/Tenant :DEF_TENANT} 
        {show-future :- Boolean false} 
        {show-expired :- Boolean false} 
        {show-suppressed :- Boolean false} 
    :summary "Fetch category descendants" 
    (ok ...)) 

Lúc đầu params boolean nơi định nghĩa là những người khác (ví dụ show-future Boolean) nhưng Swagger UI tạo được trình bày chúng như là một combobox với giá trị true làm mặc định. Trong biểu mẫu hiện tại, giao diện người dùng hiển thị hộp tổ hợp không có tùy chọn nào được chọn. Điều tương tự cũng xảy ra với người thuê nhà.

Một câu hỏi phụ: khi tôi sử dụng giao diện người dùng được tạo Swagger để gửi yêu cầu và lỗi được trả về: "levels": "(not (instance? java.lang.Integer \"2\"))". Tại sao vậy? Không phải là thư viện phải ép buộc/chuyển đổi các giá trị chuỗi thành các loại được chỉ định do API tuyên bố?

Xin cảm ơn trước.

Trả lời

5

Đối với vấn đề đầu tiên của bạn, tính năng này hoạt động như được thiết kế. Khi bạn có tham số truy vấn boolean của bạn, Swagger trả lại giao diện người dùng buộc bạn phải chọn một giá trị (hoặc true hoặc false, nó chỉ xảy ra rằng nó hiển thị đúng trên địa điểm đầu tiên).

Khi bạn thay đổi tham số truy vấn boolean thành tùy chọn, thì giá trị trống đầu tiên có nghĩa là "không gửi tham số truy vấn này" và khi bạn không thay đổi thành true hoặc false, nó sẽ không thêm thông số này truy vấn param cho yêu cầu.

Về vấn đề thứ hai của bạn với thông số truy vấn nguyên: theo mặc định schema's json-coercion-matcher chỉ định String->Long coercion but not String->Integer để không có hỗ trợ cho Integer ngoài hộp. Bạn có thể chỉ định coercer của riêng bạn trên toàn cầu cho API của bạn hoặc mỗi tuyến đường bằng cách sử dụng tùy chọn :coercion (there is an example in compojure-api test). Bạn có thể cung cấp coercer của riêng bạn mà có thể mở rộng hiện tại json-coercion-matcher với trường hợp String->Integer.

+0

Cảm ơn bạn đã trả lời. Vì vậy, về tham số tùy chọn boolean, nó không quan trọng nếu tôi xác định một giá trị mặc định, vì giá trị mặc định không được chọn trên giao diện người dùng. –

+1

@ matheus.emm Bạn phải chỉ định giá trị tham số mặc định nếu bạn muốn nó là tùy chọn. Nếu không, Swagger UI sẽ buộc bạn chọn một trong các giá trị ('true' hoặc' false') và nếu bạn gửi yêu cầu mà không chỉ định giá trị cho tham số truy vấn đó, bạn sẽ nhận được lỗi xác thực lược đồ. Giá trị mặc định là bắt buộc để tham số của bạn có giá trị hợp lệ được chỉ định (theo lược đồ của bạn) nếu nó không được cung cấp bởi người gọi. –

+0

@ matheus.emm Tôi đã cập nhật câu trả lời với thông tin về cách xử lý cưỡng ép 'Integer'. –

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