2016-07-06 6 views
2

Когда я пытаюсь извлечь многослойный-Params из запроса POST, как это:Невозможно извлечь многослойный-Params из запроса POST в 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», но в моем API-интерфейсе Multi-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))) 

В качестве запроса на самом деле не требуется, если вы не собираетесь ничего делать со всей картой запроса. Если все, что вы делаете, это printf ... возможно, включите его в printf, и вы увидите немного, как колбаса будет сделана в Ring. Его Карты все вниз.

+0

Проблема в том, что граница в заголовке запроса отличается от границы в теле запроса. Все еще большое спасибо. – Arturo

 Смежные вопросы

  • Нет связанных вопросов^_^