Мой вопрос в том, как я могу идиоматически читать тело запроса кольца, если он уже был прочитан?
Вот фон. Я пишу обработчик ошибок для приложения Ring. Когда возникает ошибка, я хочу зарегистрировать ошибку, включая всю соответствующую информацию, которая может понадобиться для воспроизведения и исправления ошибки. Одной важной частью информации является тело запроса. Однако проблема с состоянием значения :body
(потому что это тип объекта java.io.InputStream
) вызывает проблемы.
В частности, происходит то, что некоторое промежуточное программное обеспечение (промежуточное программное обеспечение ring.middleware.json/wrap-json-body
в моем случае) выполняет slurp
на теле InputStream
объект, который изменяет внутреннее состояние объекта, так что будущие вызовы slurp
возвращает пустую строку. Таким образом, [содержимое тела] эффективно теряется из карты запросов.
Единственное решение, о котором я могу думать, - это упреждающее копирование объекта body InputStream
до того, как тело может быть прочитано, на случай, если оно мне понадобится позже. Мне не нравится этот подход, потому что кажется неуклюжим делать какую-то работу над каждым запросом, если в дальнейшем может возникнуть ошибка. Есть ли лучший подход?