3

我正在使用 compojure-api 并且在尝试为我的简单 web 应用程序管理 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 Ring 应用程序中控制 Content-Type?

4

2 回答 2

3

compojure-api 以 HTTP 客户端请求的格式提供响应,该格式使用 HTTPAccept标头指示。

使用 curl 您需要添加:

-H "Accept: text/plain"

您还可以提供可接受格式的列表,服务器将以该列表中第一个支持的格式提供响应:

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

于 2017-01-13T07:25:03.213 回答
3

我从来没有尝试过 compojure 所以这里什么都没有:

1.)您的本地 valreps与别名命名空间具有相同的名称 - 有点令人困惑

2.)要访问参数 - 似乎 - 你必须申请ring.middleware.params/wrap-params你的路线

3.) 啊,是的 Content-Type: 因为你需要:form-params,由于错过了你而没有送达,wrap-params最终以某种默认路线结束 - 因此不是text/plain。这就是我认为发生的事情,至少。

lein try compojure ring-server

演示/粘贴到 repl:

(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
于 2017-01-13T17:35:00.453 回答