2017-04-08 1 views
1

POSTリクエストからフォームパラメータにアクセスできません。私はミドルウェアと設定オプションのすべての組み合わせを試しましたが、ドキュメントやSOなど(deprecated compojure/handlerオプションを含む)で見たことがありますが、私はまだパラメータを見ることができません。私は非常に明白な何かが欠けていると確信しているので、どんな提案(どれほど軽くても)は非常に高く評価されるでしょう。Compojureでネストされたデフロートを使用するとフォームパラメタにアクセスできません

ここで私のサイトのデフォルトのミドルウェアを使用し、デフォルトで提供される偽造/ CSRF保護を無効にしようとしています。しかし、私が問題のページをWebブラウザで見ようとすると、ブラウザは、それがレンダリングできなかったファイルのようにページをダウンロードしようとします。 (カール使用した場合、予想通り興味深いことに、ページがレンダリングされます。)

がここに最新の試みです:

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

前の試み:

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

がUPDATE: パラメータが表示されますが飲み込まれますアウターdefroutes

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

それでは、私の質問は次のようになります。どのようにして、ネストされたdefroutesにパラメータをスレッド化できますか?

私の一時的解決はthis解決策に基づいていますが、Steffen Frank'sははるかに簡単です。私はそれとフォローアップを試みます。

UPDATE 2:

現在の回答の両方が提供する提案を実装しようと、私は新しい問題に実行している:ルートの試合はovereagerです。例えば次のような場合、config-routesのラップ・ベーシック認証ミドルウェアのために/へのPOSTは401応答で失敗します。

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

答えて

1

だけで推測していますが、これを試してみました:

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

ありがとう、これは非常にクリーンなソリューションです。私は[this](http:// stackoverflow。com/a/28017586/382982)がアプローチしていますが、これを試してみましょう。 – pdoherty926

+0

これは動作します...並べ替え。 'api-routes'がリストの最初に来ると、それはリクエストにマッチしている/飲み込んでいます。私のネストされたデフロートのどちらも 'not-found'ハンドラを持っていないので、なぜそれが起こっているのか混乱しています。 – pdoherty926

2

を問題は、あなたがこの方法であなたのルートを定義するときということです:

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

その後、すべての要求がマッチしますapi-routesで、これはnil以外の応答を返す限りです。したがって、api-routesは要求パラメータを飲み込むのではなく、要求全体を盗みます。

代わりに、あなたのapp-routesとして(優先ソリューション)を定義する必要があります

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

をしたり、api-routesリターンが比類のないURLパスにnilていることを確認します(たとえば、それが定義されてnot-foundルートを持つべきではありません)。

+0

これをまとめてくれてありがとう。 Steffenの答えに対する私の回答を見てください。しかし、 "好ましい解決策"は命令に依存するように思われます。これは私が避けたいものです。 'api-routes'が最初に来るが、一致するものが見つからないときに何とか明示的に"不一致URLパスを返す "必要がありますか? – pdoherty926

+0

'api-routes'の実装を共有していないかどうかは分かりません。また、 'defroutes'は、そのルートが要求と一致しない場合に' nil'を返すハンドラ関数を生成します。あなたの 'api-routes'はあなたが望むべきではないと思うリクエストにマッチするようです。 –

+0

最新の反復に基づいて私の質問をサンプルで更新しました。しかし、私は "何が良い質問になるか"の指針に反してしまうのではないかと心配しています。 – pdoherty926

関連する問題