本文介绍: 也能理解的,毕竟这个本身只是用来文件上传的,存在其它参数需要取出来,就不太容易。如果是在HttpServletRequest读取请求参数,那是相当easy,可这不是servlet,拿到的只是HttpRequest请求参数没办法从HttpRequest中读取我们可以注意到,输出报文字段,会通过contenttypeboundary进行分割。在一个项目里,需要对RestTemplate请求打印日志,包括请求报文请求参数等内容类型的请求报文打印日志时候格式非常奇怪。

背景

一个项目里,需要对RestTemplate请求打印日志,包括请求报文、请求参数等内容。可是对于contenttypemutipart/form-data类型的请求报文打印日志时候格式非常奇怪。

分析

也能理解的,毕竟这个本身只是用来文件上传的,存在其它参数也需要取出来,就不太容易。如果是在HttpServletRequest中读取个请求参数,那是相当easy,可这不是servlet,拿到的只是HttpRequest,请求参数没办法从HttpRequest中读取。那就只能采用下下策,对输出字符串进行提取我们可以注意到,输出报文的字段,会通过contenttypeboundary进行分割。先通过boundary分割字段,再进行关键文字提取

public static Map<String, String&gt; parseMultipartRequest(String requestBody, String contentTypeString) {
		String boundary = extractBoundary(contentTypeString);

        Map<String, String> formData = new HashMap<>();

        String[] parts = requestBody.split("--" + boundary);

        for (String part : parts) {
            if (part.trim().isEmpty()) {
                continue; // Skip empty parts
            }

            String[] headersAndContent = part.split("rnrn", 2);
            String[] headers = headersAndContent[0].split("rn");
			if (header.length < 2) continue;
            String content = headersAndContent[1].trim();

            Map<String, String> partData = extractPartData(headers, content);
            formData.putAll(partData);
        }

        return formData;
    }

    private static Map<String, String> extractPartData(String[] headers, String content) {
        Map<String, String> partData = new HashMap<>();

        // Extract name from Content-Disposition header
        String name = null;
        for (String header : headers) {
            if (header.startsWith("Content-Disposition")) {
                name = header.split('name="')[1].split('"')[0];
                break;
            }
        }

        if (name != null) {
            partData.put(name, content);
        }

        return partData;
    }
    
	private String extractBoundary(String contentType) {
        String[] parts = contentType.split(";");
        for (String part : parts) {
            part = part.trim();
            if (part.startsWith("boundary=")) {
                return part.substring("boundary=".length());
            }
        }
        throw new IllegalArgumentException("Boundary not found in Content-Type header");
    }

原文地址:https://blog.csdn.net/interestANd/article/details/134786159

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39044.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注