2012-01-22 14 views
9

Estoy tratando de extraer un valor de la cadena de consulta url sin embargo, puedo devolver lo que creo que es un mapa, sin embargo, cuando uso el código siguiente, no lo procesa como se esperaba. ¿Alguien puede aconsejarme cómo accedo a valores específicos en la estructura de datos de la cadena de respuestas devuelta?Accediendo a la cadena de consulta de Compojure

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

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

Aquí hay dos preguntas. ¿Esta función toma un parámetro? ¿Qué es OBTENER? Aquí es por qué estoy preguntando. Deberías poder extraer lo que necesitas de params, pero ¿dónde está params? – octopusgrabbus

Respuesta

17

Tendrá que envuelva a su manejador en compojure.handler/apicompojure.handler/site o añadir middleware adecuado para obtener acceso a :query-params. Esto solía ocurrir automágicamente en defroutes, pero ya no lo hace. Una vez que lo haga, el formulario de desestructuración {params :query-params} hará que params se vincule a {"foo" "bar"} cuando llegue a /remservice con foo=bar como cadena de consulta.

(O bien, podría añadir en wrap-params etc. con la mano - éstos residen en varios espacios de nombres ring.middleware.*;. Ver the code of compojure.handler (enlace al archivo correspondiente en Compojure 1.0.1) por sus nombres)

P. ej

(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) 

Si ahora presiones http://localhost:8080/remservice?foo=bar, debería ver {"foo" "bar"} - la representación textual de su cadena de consulta analizado en un mapa Clojure.

+0

Ok, lo tengo devolviendo un mapa, sin embargo, parece que no puedo acceder en las entradas individuales, p. (: foo params) o (obtener params foo) o (map: foo params) no devuelve nada. Creo que esa es mi confusión principal en torno a la estructura del mapa. – Dale

+1

Eso se debe a que las claves se mantienen en forma de cadena; deberá usar '(obtener params" foo ")'.Alternativamente, puede usar ': params' en lugar de': query-params' - Compojure agrega 'api' en el middleware' wrap-keyword-params', por lo que el mapa ': params' está" keyified "- pero note that': params' incluye ambos tipos de parámetros (el otro es parámetros de forma; los parámetros de consulta anulan los parámetros de forma en el mapa ': params'). –

+0

¿Cómo se puede hacer algo como esto?/Users/123? Sort = desc Tengo params pasados ​​al vector. –

-1

tuve suerte en compojure 1.1.5 no necesitar un envoltorio y ser capaz de utilizar el :as Directiva

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

En la aplicación por defecto para compojure 1.2.0, el middleware cadena de consulta parece incluye por defecto. Puede inspeccionar la solicitud como tal.

(GET "/" request (str request)) 

Debe tener un montón de cosas, incluyendo la clave params.

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

Como tal, puede incluir un formulario de desestructuración Clojure estándar para acceder a los parámetros de consulta en su respuesta.

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

Su página debería verse así.

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

Como se señaló en el comentario de Michal anteriormente, sin embargo, las llaves se convierten en cadenas y si desea acceder a ellos es necesario utilizar la función get en lugar de las operaciones de búsqueda de símbolos más convenientes.

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

;;the response body should be "value1" 
Cuestiones relacionadas