Я играю с compojure-api и заблокирован при попытке управлять Content-Type для моего простого webapp. Я хочу исправить HTTP-ответ, который является простым или текстовым, но каким-то образом Compojure-API продолжает устанавливать его на «application/json».Как я могу явно задать тип контента для ответа на compojure?
(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)
My logging показывает, что функция запросила «plain/text», но каким-то образом фреймворк превзошел ее.
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"}
Как получить контроль над Content-Type в приложении Comojure-API Ring?
скорлупки. Нет радости. Я получаю тот же результат. Некоторое промежуточное ПО отбрасывает это. Grrrrr. –
Хм. Фактически это должно быть промежуточное ПО, но я не могу понять, как это сделать. Я могу вызвать это поведение всего лишь как https://github.com/metosin/compojure-api#api-with-schema--swagger-docs. Это больше похоже на ошибку в этом стеке; не соблюдая заголовок типа содержимого, заданный обработчиком, чем что-то неправильное в логике моего кода. Я очень удивлен, что здесь есть что-то вроде Content-Type. Спасибо за вашу помощь. –
Взгляните на: 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 –