2017-01-13 10 views
1

私はcompojure-apiで遊んでいて、単純なwebappのContent-Typeを管理しようとするとブロックされています。私が望むのは、プレーン/テキストのHTTPレスポンスを出すことですが、何とかCompojure-APIはそれを "application/json"に設定し続けます。コンポジットレスポンスにコンテンツタイプを明示的に設定するにはどうすればよいですか?

(POST "/echo" [] 
     :new-relic-name "/v1/echo" 
     :summary "info log the input message and echo it back" 
     :description nil 
     :return String 
     :form-params [message :- String] 
     (log/infof "/v1/echo message: %s" message) 
     (let [resp (-> (resp/response message) 
        (resp/status 200) 
        (resp/header "Content-Type" "text/plain"))] 
     (log/infof "response is %s" resp) 
     resp)) 

ただし、curlはサーバーがContent-Type:application/jsonに応答したことを示します。

$ curl -X POST -i --header 'Content-Type: application/x-www-form-urlencoded' -d 'message=frickin compojure-api' 'http://localhost:8080/v1/echo' 
HTTP/1.1 200 OK 
Date: Fri, 13 Jan 2017 02:04:47 GMT 
Content-Type: application/json; charset=utf-8 
x-http-request-id: 669dee08-0c92-4fb4-867f-67ff08d7b72f 
x-http-caller-id: UNKNOWN_CALLER 
Content-Length: 23 
Server: Jetty(9.2.10.v20150310) 

私のロギングは、機能が「プレーン/テキスト」を要求したが、何らかの形でフレームワークがそれを破棄したことを示しています。

2017-01-12 18:04:47,581 INFO [qtp789647098-46]kthxbye.v1.api [669dee08-0c92-4fb4-867f-67ff08d7b72f] - response is {:status 200, :headers {"Content-Type" "text/plain"}, :body "frickin compojure-api"} 

どのようにしてCompojure-APIリングアプリケーションでContent-Typeを制御できますか?

答えて

1

compojure-apiは、HTTP Acceptヘッダーを使用して示されたHTTPクライアントから要求された形式の応答を提供します。あなたが追加する必要がカールして

-H "Accept: text/plain"

あなたはまた、許容可能な形式のリストを提供することができ、サーバはそのリストから最初のサポートされている形式でレスポンスを提供します:

-H "Accept: text/plain, text/html, application/xml, application/json, */*"

+0

Shucks REPLに

lein try compojure ring-server 

デモ/ペーストで

。喜びはありません。私は同じ結果を得る。いくつかのミドルウェアがこれを酷使しています。 Grrrrr。 –

+0

Hmm。それは事実上ミドルウェアでなければならないが、私はどのように把握できない。私はこの動作をhttps://github.com/metosin/compojure-api#api-with-schema--swagger-docsの例のように少しでも誘導することができます。これはスタックのバグのような感じです。ハンドラによって設定されたコンテンツタイプのヘッダーを尊重しないで、私のコードのロジックに何か間違っています。 Content-Typeと同じくらいシンプルなものが何かチャレンジングなのは非常に驚いています。しかし、助けてくれてありがとう。 –

+1

https://github.com/ngrunwald/ring-middleware-format/blob/master/src/ring/middleware/format_response.clj#L187をご覧ください。優先エンコーダーを選択します。一致しない場合は最初のエンコーダーを選択します。 compojure-apiはplain/textをサポートしていないので、最初のものはJSONです:https:// github。com/metosin/compojure-api/blob/59b5d2271ac952ee6a7d3bad484f4e1510b18a59/src/compojure/api/api.clj#L26 –

1

私はコンポジットを試したことがないので、ここには何も入っていません。

1.)y

2.混乱

の一種)のparamsへのアクセスを得るために - - 私たちの地元のval repsは、エイリアスの名前空間と同じ名前を持つそうです - あなたはあなたのルート

3.

)ああ ring.middleware.params/wrap-paramsを適用する必要がありそうContent-Type: wrap-paramsが見つからないため配信されなかった :form-paramsが必要なため、何らかの種類のデフォルトルートになったため、 text/plainではありません。それは私が起こったと思うもの、少なくとも。

(require '[compojure.core :refer :all]) 
(require '[ring.util.response :as resp]) 
(require '[ring.server.standalone :as server]) 
(require '[ring.middleware.params :refer [wrap-params]]) 

(def x 
    (POST "/echo" [message] 
     :summary "info log the input message and echo it back" 
     :description nil 
     :return String 
     :form-params [message :- String] 
     (let [resp (-> (resp/response (str "message: " message)) 
        (resp/status 200) 
        (resp/header "Content-Type" "text/plain"))] 
     resp))) 

(defroutes app (wrap-params x)) 

(server/serve app {:port 4042}) 

試験:

curl -X POST -i --header 'Content-Type: application/x-www-form-urlencoded' -d 'message=frickin' 'http://localhost:4042/echo' 
HTTP/1.1 200 OK 
Date: Fri, 13 Jan 2017 17:32:03 GMT 
Content-Type: text/plain;charset=ISO-8859-1 
Content-Length: 14 
Server: Jetty(7.6.13.v20130916) 

message: frickin 
関連する問題