Thiết bị truyền động khởi động của mùa xuân Trace
thực hiện tốt việc thu thập thông tin HTTP đầu vào/đầu ra, tiêu đề, người dùng, v.v. Tôi muốn mở rộng nó để nắm bắt cơ thể phản hồi HTTP, theo cách đó tôi có thể xem toàn bộ những gì đang đến và đi ra khỏi lớp web. Nhìn vào TraceProperties
, có vẻ như không có cách nào để định cấu hình phản hồi nội dung. Có cách nào "an toàn" để nắm bắt cơ thể phản hồi mà không làm rối tung luồng ký tự nào đang gửi lại không?Làm cách nào để bao gồm nội dung phản hồi JSON trong Dấu vết của bộ khởi động Spring Boot?
10
A
Trả lời
2
Gần đây, tôi đã viết một blog post về tuỳ biến của trace
endpoint Xuân Boot Actuator và khi chơi với Actuator, tôi đã kinda ngạc nhiên rằng response body
không phải là một trong những tài sản được hỗ trợ để theo dõi.
Tôi nghĩ rằng tôi có thể cần tính năng này và đưa ra giải pháp nhanh chóng nhờ vào Logback's TeeFilter
.
Để sao chép luồng đầu ra của phản hồi, tôi đã sao chép và sử dụng TeeHttpServletResponse và TeeServletOutputStream mà không kiểm tra quá nhiều.
Sau đó, giống như tôi đã giải thích trong bài viết trên blog, mở rộng WebRequestTraceFilter
như:
@Component
public class RequestTraceFilter extends WebRequestTraceFilter {
RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
super(repository, properties);
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response);
filterChain.doFilter(request, teeResponse);
teeResponse.finish();
request.setAttribute("responseBody", teeResponse.getOutputBuffer());
super.doFilterInternal(request, teeResponse, filterChain);
}
@Override
protected Map<String, Object> getTrace(HttpServletRequest request) {
Map<String, Object> trace = super.getTrace(request);
byte[] outputBuffer = (byte[]) request.getAttribute("responseBody");
if (outputBuffer != null) {
trace.put("responseBody", new String(outputBuffer));
}
return trace;
}
}
Bây giờ, bạn có thể nhìn thấy responseBody
trong JSON trace
endpoint phục vụ.
Các vấn đề liên quan
- 1. Bao gồm toàn bộ nội dung của một tệp và phản hồi nó
- 2. Khởi động Spring tùy chỉnh phản hồi lỗi http?
- 3. Livereload cho nội dung trong Intellij sử dụng Spring boot
- 4. Tự động gán kiểu nội dung phản hồi json trong WCF Azure Service Bus
- 5. Làm cách nào để xóa dấu vết của Trường thuộc loại nội dung mô-đun?
- 6. Đọc nội dung phản hồi trong Bộ chặn Android của Android
- 7. Cách bao gồm định dạng của Nội dung trả lời JSON trong tài liệu được tạo bởi Enunciate?
- 8. Xuân Boot: Bao bì JSON phản ứng trong phụ huynh năng động đối tượng
- 9. Làm cách nào để bao gồm ngoại lệ OAuth2?
- 10. Làm thế nào để bao gồm một ký hiệu (&) trong nội dung của một ComboBoxItem
- 11. GZIP nội dung phản hồi trong PlayFramework 2.0
- 12. Làm cách nào để khởi động Spring Boot tự động kết nối lại với PostgreSQL?
- 13. Sửa mặc định JSON lỗi phản hồi từ mùa xuân Boot Nghỉ ngơi điều khiển
- 14. Cách truy cập nội dung phản hồi lỗi trong Volley?
- 15. dấu vết python: chỉ bao gồm một số tác phẩm
- 16. Cách lấy EntityGraph động trong Spring Boot
- 17. Cách đánh dấu tiêu đề phản hồi HTTP trong Chrome? cho nội dung "tệp đính kèm"?
- 18. cách bao gồm mã HTML trong nội dung thư Mailx
- 19. spring-boot không thể khởi động trong docker
- 20. Tại sao JBuilder không trả về nội dung phản hồi trong JSON khi kiểm tra RSPEC
- 21. Làm cách nào để bao gồm ký tự "nội dung" được mã hóa HTML trong CSS?
- 22. Viết nội dung phản hồi bằng BaseHTTPRequestHandler
- 23. Làm cách nào để phản hồi bộ định tuyến phản hồi với mã trạng thái 404?
- 24. Bao gồm nội dung của một biến bên trong bộ lọc Haml
- 25. Thanh công cụ của Android bao gồm nội dung
- 26. Cách đặt độ dài nội dung trong Spring MVC REST cho JSON?
- 27. Cách bao gồm tham chiếu nội bộ trong khối mã?
- 28. Bao gồm nội dung SVG trong mẫu Lưỡi Laravel 5
- 29. Phản hồi Zip JSON trong node.js
- 30. Làm cách nào để triển khai Bộ lọc Phản hồi HTTP để hoạt động trên toàn bộ nội dung cùng một lúc, không có chunking
Tôi đã cố gắng sử dụng câu trả lời này. Sao chép mã chính xác từ trên xuống và hai lớp TeeHttpServletResponse và TeeServletOutputStream. Bây giờ/dấu vết cho tôi 500 với "Không thể gọi sendError() sau khi phản hồi đã được cam kết", và bất kỳ tài nguyên nào khác cho tôi 200 lỗi "lỗi cú pháp" của cơ thể. Trong bản ghi mùa xuân, tôi không thể thấy bất kỳ lỗi nào – isADon