кольцо: чтение тела http-запроса в виде строки

При обработке http-запроса внутри кольцевого сервера тело данных запроса сохраняется в хэш-карте запроса в ключе :body. Например, следующим образом:

#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"] 

В случае, если меня просто интересует необработанный текст, как я могу прочитать этот объект?


person Anton Harald    schedule 23.05.2016    source источник


Ответы (2)


Можно использовать ring.util.request/body-string, тело запроса в виде строки.

(body-string request) 

Вы должны помнить, что InputStream можно прочитать только один раз, поэтому вы можете вместо этого заменить исходный :body на прочитанный String, чтобы позже вы могли снова получить к нему доступ:

(defn wrap-body-string [handler]
  (fn [request]
    (let [body-str (ring.util.request/body-string request)]
      (handler (assoc request :body (java.io.StringReader. body-str))))))

И добавьте свое промежуточное ПО, чтобы обернуть обработчик:

(def app
  (wrap-body-string handler))
person Piotrek Bzdyl    schedule 23.05.2016

:body запроса на звонок должен быть экземпляром java.io.InputStream. Таким образом, вы можете использовать reader + slurp, чтобы получить строку.

(defn is->str [is]
  (let [rdr (clojure.java.io/reader is)]
    (slurp rdr)))

Использование: (is->str (:body request))

person Ming    schedule 24.04.2017
comment
slurp может потреблять InputStream напрямую, нет необходимости оборачивать его в ридер. - person user1338062; 13.12.2019