7

次のルート定義があります。

(require '[compojure.core :as ccore]
         '[ring.util.response :as response])

(def *main-routes*
     (ccore/defroutes avalanche-routes
       (ccore/GET "/" [] "Hello World 2")
       (ccore/GET "/images/:id" [id] (get-image-response id))))

この例では、リクエスト/はチャームのように機能し、期待値を返しますHello World 2

get-images-responseメソッドは次のように定義されます。

(defn get-image-response
  [id]
  (let [record (db/get-image id false)]
    (-> (response/response (:data record))
        (response/content-type (:content-type record))
        (response/header "Content-Length" (:size record)))))

私は404を取得しているので、バイナリファイルの提供はまだ完全には機能していません。なぜ何かアイデアはありますか?

編集:わかりました。この問題は、で画像がリクエストされているという事実に関連してい/images/name.jpgます。.jpgハンドラーを削除するとすぐに呼び出されます。したがって、問題は、拡張機能以外のものにどのように一致させるかということです。

4

2 に答える 2

12

Compojureは、ルートマッチングに影響力を使用します。ドット文字は、影響力のあるルートでは特別な意味を持ちます。スラッシュ文字と同様に、トークンの区切り文字を表します。次の文字はすべて、影響力でこの意味を持っています/ . , ; ?

つまり、のようなルートは、以降"/images/:id"のフォームのURIと一致せず、それぞれがclout内の個別のトークンを表します。/images/name.jpgimagesnamejpg

それに合わせるために、必要に応じてさまざまな方法でルートを作成できます。

すべての画像に.jpg拡張子が付いている場合、最も簡単な方法は次のとおりです。

(GET "/images/:id.jpg" [id] ...)

拡張子が異なる場合は、次のようにすることができます。

(GET "/images/:name.:extension" [name extension] ...)

拡張機能を制限する場合は、compojure/cloutに正規表現を渡すことができます。

(GET ["/images/:name.:ext", :ext #"(jpe?g|png|gif)"] [name ext] ...)

ワイルドカードを使用することもできます。ワイルドカードは精度が低く、次で始まるURIと一致します/images/

(GET "/images/*" [*] ...)
于 2010-10-21T19:02:03.290 に答える
5

この場合の本当の答えは、clojure-couchdbライブラリにバグがあったということでした。パッチはここのgithubで入手できます。

つまり、{:as:byte-array}マップパラメーターと値を、clj-httpを介してcouchのAPIに送信されるリクエストに追加することになります。

私のコードのもう1つの問題は、ringバイト配列をレンダリングするときに、バイト配列をどう処理するかが実際にはわからないことでした。リングにパッチを適用するのではなく、バイト配列をにラップしましたjava.io.ByteArrayInputStream。ダウンロードを処理するための完全なコードは次のとおりです。

(defn get-image-response
  [id]
  (let [record (db/get-image id false)]
    (-> (response/response (new java.io.ByteArrayInputStream (:data record)))
        (response/content-type (:content-type (:content-type record)))
        (response/header "Content-Length" (:size record)))))
于 2010-10-21T20:57:44.897 に答える