2016-07-06 3 views
2

でPOSTリクエストからマルチパートのparamsを抽出することはできません:はcompojure

(defroutes upload-routes 
    (POST "/upload" {params :params} (println params)) 

私は{}を得ました。

それから私はこのように試してみました:

(defroutes upload-routes 
    (POST "/upload" {multipart-params :multipart-params} (println multipart-params)) 

私はまだ{}を得ました。

私のミドルウェアについて何か間違っていると思います。

だから私はここに、ハンドラを変更しようとした私が試したハンドラです:

(ns cloudserver.handler 
    (:require [compojure.core :refer [defroutes routes]] 
      [compojure.route :as route] 
      [compojure.handler :as handler] 
      [cloudserver.routes.home :refer [home-routes]] 
      [noir.util.middleware :as noir-middleware] 
      [cloudserver.routes.auth :refer [auth-routes]] 
      [cloudserver.routes.upload :refer [upload-routes]] 
      [cloudserver.routes.search :refer [search-routes]] 
      [cloudserver.routes.download :refer [download-routes]] 
      [ring.middleware.defaults :refer [api-defaults wrap-defaults site-defaults]] 
      [ring.middleware.multipart-params :refer [wrap-multipart-params]] 
      [ring.middleware.params :refer [wrap-params]] 
      [noir.session :as session] 
      [ring.middleware.session.memory :refer [memory-store]])) 


(def app 
    (-> 
    (routes auth-routes 
      home-routes 
      upload-routes 
      search-routes 
      download-routes 
      app-routes) 
    session/wrap-noir-session 
    (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false) 
    wrap-multipart-params 
    wrap-params)) 

(def app 
    (-> 
    (routes auth-routes 
      home-routes 
      upload-routes 
      search-routes 
      download-routes 
      app-routes) 
    session/wrap-noir-session 
    (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false) 
    wrap-multipart-params)) 

(def app 
    (-> 
    (routes auth-routes 
      home-routes 
      upload-routes 
      search-routes 
      download-routes 
      app-routes) 
    session/wrap-noir-session 
    (wrap-defaults (-> site-defaults 
         (assoc-in [:security :anti-forgery] false) 
         (assoc-in [:params :multipart] true) 
         (assoc-in [:params :nested] true))) 
    handler/site)) 

(def app 
    (-> 
    (routes auth-routes 
      home-routes 
      upload-routes 
      search-routes 
      download-routes 
      app-routes) 
    wrap-multipart-params 
    session/wrap-noir-session 
    (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false))) 

(def app 
    (noir-middleware/app-handler 
    [auth-routes 
    home-routes 
    upload-routes 
    search-routes 
    download-routes 
    app-routes] 
    :ring-defaults (assoc site-defaults :security nil))) 

しかし、私が得た唯一の結果は、私のクライアントコードがある{}


です:

public int upload (String filename, String[] tags, String time, String fingerprint) throws IOException { 
    String url = host + "/upload"; 
    CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); 
    HttpPost httpPost = new HttpPost(url); 

    MultipartEntityBuilder mulentity = MultipartEntityBuilder.create(); 

    mulentity.addBinaryBody("photo", new File(filename)); 

    for (int i = 0; i < tags.length; i ++) { 
     mulentity.addTextBody("tag" + i, tags[i]); 
    } 

    mulentity.addTextBody("fingerprint", fingerprint); 
    mulentity.addTextBody("time", time); 
    mulentity.addTextBody("filename", filename.substring(filename.lastIndexOf(File.separatorChar) + 1, filename.length())); 

    HttpEntity entity = mulentity.build(); 
    httpPost.setEntity(entity); 
    httpPost.setHeader("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); 

    int status = 3; 

    try { 
     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
     String response = httpClient.execute(httpPost, responseHandler); 
     status = Integer.parseInt(response); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } finally { 
     httpClient.close(); 
    } 
    return status; 

} 

私は本当にclojureウェブプログラミングの緑の手です。どうもありがとう!


問題が和らぐ。要求の境界が間違っているからです。

答えて

2

私はあまりにも "Clojure Green"ですが、マルチパートRing + Compojure APIアプリでは、マルチパートリクエストに含まれるパラメータの名前のリクエストをただちに分解します。実際に一時ファイルであるものは、以下のprintfで出力されます。 "#object [java.io.File 0x4blahblahblah"のような文字列表現です。ミドルウェアはリクエストマップからそれを持ち上げ、名前だけでパラメータを利用できるようにしました。

(defroutes upload-routes 
    (POST "/upload" [photo tag fingerprint time filename :as request] 
    (printf 
     "photo %s, tag %s, fingerprint %s, time %s, filename %s" 
     photo tag fingerprint time filename))) 

リクエストマップ全体で何もしない場合、:asリクエストは本当に必要ありません。もしあなたがしていることがprintfなら... printfにそれを含めると、ソーセージがどのようにリングで作られるのか少し見えます。その地図は一番下にあります。

+0

要求のヘッダーの境界が要求の本文の境界と異なる問題があります。まだありがとうございます。 – Arturo

関連する問題