2015-03-30 3 views
4

Я пытаюсь понять, почему Ring resource-response решит ответить с типом контента application/octet-stream. Недавно я обновил некоторый пример кода, из которого я учился, так что он использует новый ring-defaults. До использования ring-defaults этот код отвечал на тип содержимого html. Почему теперь вы выбираете октет-поток?Почему ответ ресурса кольца отвечает типом содержимого приложения/октета-потока?

(ns replays.handler 
    (:require [compojure.core :refer [GET defroutes]] 
      [compojure.route :as route] 
      [ring.util.response :refer [response resource-response]] 
      [ring.middleware.json :as middleware] 
      [ring.middleware.defaults :refer [wrap-defaults api-defaults]])) 

(defroutes app-routes 
    (GET "/" [] (resource-response "index.html" {:root "public"})) 
    (GET "/widgets" [] (response [{:name "Widget 1"} {:name "Widget 2"}])) 
    (route/resources "/public") 
    (route/not-found "not found")) 

(def app 
    (-> app-routes 
     (middleware/wrap-json-body) 
     (middleware/wrap-json-response) 
     (wrap-defaults api-defaults))) 

И для номера версии, вот файл проекта ...

(defproject replays "0.1.0-SNAPSHOT" 

    :url "http://example.com/FIXME" 
    :description "FIXME: write description" 

    :plugins [[lein-pdo "0.1.1"] 
      [lein-ring "0.9.3"] 
      [lein-cljsbuild "1.0.5"]] 

    :dependencies [[org.clojure/clojure "1.6.0"] 
       [org.clojure/core.async "0.1.346.0-17112a-alpha"] 
       [org.clojure/clojurescript "0.0-3126"] 
       [org.omcljs/om "0.8.8"] 
       [ring/ring-core "1.3.2"] 
       [ring/ring-json "0.3.1"] 
       [ring/ring-defaults "0.1.4"] 
       [compojure "1.3.2"] 
       [cljs-http "0.1.29"]] 

    :source-paths ["src/clj"] 

    :ring {:handler replays.handler/app} 

    :cljsbuild {:builds [{:id "dev" 
         :source-paths ["src/cljs"] 
         :compiler {:output-to "resources/public/js/app.js" 
            :output-dir "resources/public/js/out" 
            :optimizations :none 
            :source-map true}}]} 

    :aliases {"up" ["pdo" "cljsbuild" "auto" "dev," "ring" "server-headless"]} 

    :profiles {:dev {:dependencies [[javax.servlet/servlet-api "2.5"] 
            [ring-mock "0.1.5"]]}}) 
+3

я не уверен, но я думаю, что это связано с тем, что [ 'наматывается контент-type' ] (https://ring-clojure.github.io/ring/ring.middleware.content-type.html) использует расширение в вашем URI для установки заголовков типов контента? Его можно обойти, добавив расширение в URI или вручную настроив тип контента '(ассоциативный (ресурс-ответ ...) [: заголовки« Content-Type »]« text/html »)' – noisesmith

+1

Я считаю, что ваше предложение - подходящий способ сделать это. Есть также функция, которая делает что-то подобное: http://ring-clojure.github.io/ring/ring.util.response.html#var-content-type – Ryan

+0

Да, я избегал ответа, потому что в то время как Я предлагаю работать, он также чувствует, как делать вручную то, что должно быть для вас промежуточным программным обеспечением. Но если вы посмотрите на источник этой функции, он вызывает заголовок, а заголовок делает в значительной степени то, что я поставил выше. – noisesmith

ответ

4

Это происходит потому, что api-defaults (на самом деле это ring.middleware.content-type) пытается угадать тип содержимого на основе данных, которые вы прошли к нему. Он использует расширения файлов для этого, и с тех пор, как вы используете resource-response, расширение не существует. Таким образом, по умолчанию ring.middleware.content-type использует application/octet-stream.

Решение предоставить ваш тип содержимого для ответа, как показано ниже:

(ns app.routes 
    (:require [compojure.core :refer [defroutes GET]] 
      [ring.util.response :as resp])) 

(defroutes appRoutes 
    ;; ... 
    ;; your routes 
    ;; ... 
    (GET "/" 
     resp/content-type (resp/resource-response "index.html" {:root "public"}) "text/html"))