java异常推送-新增 curl

文章介绍了如何创建一个`RepeatedlyReadRequestWrapper`类,用于多次读取HttpServletRequest的内容,以及一个`ReadBodyHttpServletFilter`过滤器,它在适当条件下将请求传递给`RepeatedlyReadRequestWrapper`。同时,文章还提及了如何从HttpServletRequest获取请求参数并构造Curl命令。
摘要由CSDN通过智能技术生成

(1)新增一个HttpServletRequestWrapper类

public class RepeatedlyReadRequestWrapper extends HttpServletRequestWrapper {

    private byte[] body;

    /**
     * @param request
     */
    public RepeatedlyReadRequestWrapper(HttpServletRequest request) {
        super(request);
    }


    @Override
    public BufferedReader getReader() {
        ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body);
        return new BufferedReader(new InputStreamReader(byteArrayIns));
    }

    @Override
    public ServletInputStream getInputStream() {
        try {
            body = StreamUtils.copyToByteArray(getRequest().getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
        final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body);
        ServletInputStream servletIns = new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }

            @Override
            public int read() {
                return byteArrayIns.read();
            }
        };
        return servletIns;
    }

}

(2)添加一个 Filter对请求的request进到 RepeatedlyReadRequestWrapper处理

@Component
@WebFilter("/*")
public class ReadBodyHttpServletFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        if (StrUtil.isNotBlank(httpServletRequest.getContentType()) && !httpServletRequest.getContentType().contains(ContentType.MULTIPART.getValue())) {
            RepeatedlyReadRequestWrapper requestWrapper = new RepeatedlyReadRequestWrapper(httpServletRequest);
            filterChain.doFilter(requestWrapper, httpServletResponse);
        } else {
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    }

    @Override
    public void destroy() {
    }


}

(3)最后在推送飞书的 AppenderBase获取到 request拼接 curl

private String getCurlCommand(HttpServletRequest request) {
        String requestBody = null;
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            requestBody = stringBuilder.toString();
        } catch (Exception e) {
            return null;
        }

        List<String> paramsList = new ArrayList<>();
        for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
            String k = entry.getKey();
            paramsList.add(k + "=" + request.getParameterMap().get(k)[0]);
        }
        String method = request.getMethod() + " ";

        String params = String.join("&", paramsList);

        String url = request.getRequestURL().toString();

        String headers = Collections.list(request.getHeaderNames())
                .stream()
                .map(name -> "-H '" + name + ": " + request.getHeader(name) + "'" + "\n")
                .reduce("", (acc, item) -> acc + " " + item);
        String dataRaw = "--data-raw $'" + requestBody + "'";
        if (StrUtil.isNotBlank(params)) {
            url = url + "?" + params;
        }
        String curlCommand = "curl -X " + method + "'"  + url + "'" + "\n" + headers;
        if (StrUtil.isNotBlank(requestBody)) {
            curlCommand = curlCommand + dataRaw;
        }
        return curlCommand;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值