2017-04-08 9 views
1

Je ne parviens pas à accéder aux paramètres de formulaire à partir d'une requête POST. J'ai essayé toutes les combinaisons d'options de middleware et de configuration que j'ai vues dans les docs, sur SO, etc. (y compris les options obsolètes compojure/handler) et je suis toujours incapable de voir les paramètres. Je suis sûr qu'il me manque quelque chose de très évident, alors toutes les suggestions (peu importe la gravité) seraient grandement appréciées.Impossible d'accéder aux paramètres de formulaire lors de l'utilisation de défracements imbriqués dans Compojure

Voici ma dernière tentative, dans laquelle j'essaie d'utiliser le middleware par défaut de site et de désactiver la protection anti-contrefaçon/CSRF fournie par défaut. (Je sais que c'est une mauvaise idée.) Cependant, lorsque j'essaie d'afficher la page en question dans un navigateur Web, le navigateur essaie de télécharger la page, comme s'il s'agissait d'un fichier qu'il n'était pas capable de rendre. (Fait intéressant, la page est affichée comme prévu lors de l'utilisation Curl.)

est ici la dernière tentative:

(defroutes config-routes* 
    (POST "/config" request post-config-handler)) 

(def config-routes 
    (-> #'config-routes* 
    (basic-authentication/wrap-basic-authentication authenticated?) 
    (middleware-defaults/wrap-defaults (assoc middleware-defaults/site-defaults :security {:anti-forgery false})))) 

tentative précédente:

(def config-routes 
    (-> #'config-routes* 
    (basic-authentication/wrap-basic-authentication authenticated?) 
    middleware-params/wrap-params)) 

MISE À JOUR: Les paramètres semblent être avalés par l'extérieur defroutes:

(defroutes app-routes 
    (ANY "*" [] api-routes) 
    (ANY "*" [] config-routes) 
    (route/not-found "Not Found")) 

Donc, ma question devient maintenant: Comment puis-je thread les paramètres à travers le defroutes imbriqué?

Ma résolution temporaire est basée sur la solution this, mais Steffen Frank's est beaucoup plus simple. Je vais essayer cela et le suivi.

MISE À JOUR 2:

En essayant de mettre en œuvre les suggestions fournies par les deux réponses actuelles, je suis en cours d'exécution dans un nouveau numéro: les matches de la route sont overeager. par exemple. étant donné ce qui suit, les POST vers/quelque chose échouent avec une réponse 401 en raison du middleware d'authentification wrap-basic-authentication dans config-routes.

(defroutes api-routes* 
    (POST "/something" request post-somethings-handler)) 

(def api-routes 
    (-> #'api-routes* 
    (middleware-defaults/wrap-defaults middleware-defaults/api-defaults) 
    middleware-json/wrap-json-params 
    middleware-json/wrap-json-response)) 

(defroutes config-routes* 
    (GET "/config" request get-config-handler) 
    (POST "/config" request post-config-handler)) 

(def config-routes 
    (-> #'config-routes* 
    (basic-authentication/wrap-basic-authentication authenticated?) 
    middleware-params/wrap-params)) 

(defroutes app-routes 
    config-routes 
    api-routes 
    (route/not-found "Not Found")) 

(def app app-routes) 

Répondre

1

Juste une supposition, mais vous avez essayé:

(defroutes app-routes 
    api-routes 
    config-routes 
    (route/not-found "Not Found")) 
+0

Merci, c'est une solution très propre. J'ai fini par utiliser [this] (http: // stackoverflow.com/a/28017586/382982), mais nous allons essayer. – pdoherty926

+0

Cela fonctionne ... en quelque sorte. Si 'api-routes' arrive en premier dans la liste, il correspond/avale la demande et je suis de retour à l'endroit où j'ai commencé. Aucun de mes défragements imbriqués n'a de gestionnaire 'non-trouvé ', donc je suis confus quant à la raison pour laquelle cela se produit. – pdoherty926

2

Le problème est que lorsque vous définissez vos itinéraires ainsi:

(defroutes app-routes 
    (ANY "*" [] api-routes) 
    (ANY "*" [] config-routes) 
    (route/not-found "Not Found")) 

alors toute demande sera jumelée par api-routes tant qu'il renvoie une réponse non nulle. Ainsi, api-routes ne pas avaler vos paramètres de requête, mais plutôt voler toute la demande.

Au lieu de cela, vous devez définir votre app-routes comme (solution préférée):

(defroutes app-routes 
    api-routes 
    config-routes 
    (route/not-found "Not Found")) 

ou assurez-vous que vos api-routes renvoie nil pour le chemin d'URL sans équivalent (par exemple, il ne devrait pas avoir défini la route not-found).

+0

Merci de mettre cela ensemble. Voir ma réponse à la réponse de Steffen, mais la «solution préférée» semble être dépendante de l'ordre, ce que je voudrais éviter. Dois-je explicitement renvoyer "nil pour un chemin d'URL sans correspondance" quand "api-routes" vient en premier mais ne trouve pas de correspondance? – pdoherty926

+0

Il est difficile de dire si vous ne partagez pas l'implémentation de 'api-routes'. 'Defroutes' créera également une fonction de gestionnaire qui retourne' nil' si ses routes ne correspondent pas à la requête. Il semble que vos 'api-routes' correspondent à des requêtes que vous pensez ne pas être. –

+0

J'ai mis à jour ma question avec un échantillon basé sur ma dernière itération. Cependant, je crains que je commence à aller à l'encontre de la directive «ce qui fait une bonne question». – pdoherty926