2012-01-22 31 views
9

Tôi đang cố gắng kéo giá trị ra khỏi chuỗi truy vấn url tuy nhiên tôi có thể trả lại những gì tôi tin là bản đồ, tuy nhiên khi tôi sử dụng mã bên dưới, nó không xử lý như mong đợi. Bất cứ ai có thể tư vấn cho làm thế nào tôi truy cập vào các giá trị cụ thể trong cơ sở hạ tầng truy vấn trả về?Truy cập chuỗi truy vấn Compojure

http://localhost:8080/remservice?foo=bar

(defroutes my-routes 
    (GET "/" [] (layout (home-view))) 
    (GET "/remservice*" {params :query-params} (str (:parameter params)))) 
+0

Dưới đây là hai câu hỏi. Chức năng này có tham số không? GET là gì? Đây là lý do tại sao tôi hỏi. Bạn sẽ có thể trích xuất những gì bạn cần từ params, nhưng đâu là params? – octopusgrabbus

Trả lời

17

Bạn sẽ cần phải quấn xử lý của bạn trong compojure.handler/api hay compojure.handler/site thêm middleware phù hợp để đạt được quyền truy cập vào :query-params. Điều này từng xảy ra tự động trong defroutes, nhưng không còn xảy ra nữa. Khi bạn làm điều đó, biểu mẫu hủy {params :query-params} sẽ gây ra params bị ràng buộc với {"foo" "bar"} khi bạn nhấn /remservice với chuỗi truy vấn foo=bar.

(Hoặc bạn có thể thêm vào wrap-params vv bằng tay - những cư trú trong nhiều ring.middleware.* namespace;. Thấy the code of compojure.handler (liên kết đến tập tin có liên quan trong Compojure 1.0.1) cho tên của họ)

Ví dụ:

(defroutes my-routes 
    (GET "/remservice*" {params :query-params} 
     (str params))) 

(def handler (-> my-routes compojure.handler/api)) 

; now pass #'handler to run-jetty (if that's what you're using) 

Nếu bây giờ bạn nhấn http://localhost:8080/remservice?foo=bar, bạn sẽ thấy {"foo" "bar"} - đại diện văn bản của chuỗi truy vấn của bạn phân tách thành một bản đồ Clojure.

+0

Ok tôi đã trả lại bản đồ, tuy nhiên tôi dường như không thể truy cập vào các mục nhập riêng lẻ, ví dụ: (: foo params) hoặc (lấy params foo) hoặc (map: foo params) không trả về bất cứ thứ gì. Tôi nghĩ rằng sự nhầm lẫn chính của tôi xung quanh cấu trúc bản đồ này đã trở lại. – Dale

+1

Đó là vì các khóa được giữ ở dạng chuỗi - bạn sẽ cần phải sử dụng '(get params" foo ")'.Ngoài ra, bạn có thể sử dụng ': params' thay vì': query-params' - 'api' của Compojure thêm vào phần tử trung gian' wrap-keyword-params', vì vậy bản đồ ': params' là" keyified "- nhưng lưu ý ': params' bao gồm cả hai kiểu tham số (tham số khác là tham số biểu mẫu; tham số truy vấn ghi đè tham số biểu mẫu trong bản đồ': params'). –

+0

Làm thế nào để bạn làm điều gì đó như thế này:/users/123? Sort = desc Tôi có thông số được chuyển đến vectơ. –

-1

tôi đã may mắn trong compojure 1.1.5 không cần một wrapper và có thể sử dụng các chỉ thị :as

(GET "/tweet/:folder/:detail" [folder detail :as req] 
    (twitter-controller/tweet folder detail (-> req :params :oauth_verifier)) 
0

Trong ứng dụng mặc định cho compojure 1.2.0, middleware chuỗi truy vấn dường như bao gồm theo mặc định. Bạn có thể kiểm tra yêu cầu như vậy.

(GET "/" request (str request)) 

Cần có nhiều thứ, kể cả khóa params.

{ . . . :params {:key1 "value1" :key2 "value2} . . . } 

Như vậy, bạn có thể bao gồm một hình thức destructuring Clojure tiêu chuẩn để truy cập vào các thông số truy vấn trong trả lời của bạn.

(GET "/" {params :params} (str params)) 

Trang của bạn sẽ trông giống như sau.

{"key1" "value1", "key2" "value2"} 

Như đã đề cập trong các bình luận của Michal trên, tuy nhiên, các phím được chuyển đổi thành chuỗi và nếu bạn muốn truy cập chúng bạn cần phải sử dụng get chức năng chứ không phải là tra cứu biểu tượng thuận tiện hơn.

(GET "/" {params :params} (get params "key1")) 

;;the response body should be "value1" 
Các vấn đề liên quan