Spring REST Controller所有Content-Type均不支持问题求助
排查HTML转PDF Web Service的Content-Type请求问题
我来帮你梳理下这个问题的排查方向,毕竟我之前做类似功能时也踩过不少坑😉
1. 先校准端点的接收配置核心逻辑
不管你用的是Spring Boot还是其他Web框架,先把端点的接收逻辑拉到最简状态排查:
- 如果是Spring的
@PostMapping,与其纠结consumes属性,不如直接指定最贴合HTML的媒体类型:MediaType.TEXT_HTML_VALUE,毕竟你要接收的是HTML内容,用text/html比text/plain更符合HTTP规范,框架也能更准确地解析请求体。 - 确保你的参数是
@RequestBody String htmlContent,不要用@RequestParam这类表单参数注解,否则Postman发送的纯文本HTML会被当成表单参数解析,直接报错。
2. 盯紧Postman的请求发送细节
很多时候问题出在Postman的配置上,别小看这些细节:
- 一定要选
raw格式,然后在下拉框里选HTML(不是Text),手动把请求头的Content-Type设为text/html,避免Postman自动给你加一些奇怪的格式(比如JSON包裹、表单编码)。 - 检查Postman有没有自动添加
Accept头,如果你的服务只返回PDF,建议把Accept设为application/pdf,虽然这一般不影响请求接收,但能避免框架做不必要的内容协商。
3. 打印请求日志,看真实接收内容
最直接的排查方法是在服务端打印完整的请求信息,搞清楚Postman到底发了什么:
比如在Spring里可以这么做:
@PostMapping("/generate-pdf") public ResponseEntity<byte[]> generatePdf(HttpServletRequest request, @RequestBody String htmlContent) { // 打印所有请求头 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String header = headerNames.nextElement(); System.out.println("Header: " + header + " = " + request.getHeader(header)); } // 打印接收到的HTML内容 System.out.println("Received HTML: " + htmlContent); // 暂时注释iText逻辑,先确认请求能正常接收 // ...后续PDF生成逻辑 }
通过日志你就能清楚看到:请求头是否匹配、接收的内容是不是你发送的原始HTML,有没有被篡改。
4. 先测试最简端点,排除业务逻辑干扰
把iText的PDF生成逻辑暂时注释掉,写一个极简的端点,只返回接收到的内容:
@PostMapping(value = "/test-html", consumes = MediaType.TEXT_HTML_VALUE) @ResponseBody public String testHtmlReceive(@RequestBody String html) { return "Received HTML:\n" + html; }
如果这个最简端点都报错,那问题肯定在请求与端点的匹配上;如果能正常返回,那就是iText处理逻辑的问题(比如HTML格式不兼容、iText版本过低)。
5. 排查iText的HTML解析逻辑
如果请求能正常接收,但生成PDF时报错,那得聚焦iText的代码:
- 确保用的是iText 7的最新稳定版,旧版本对HTML5标签、特殊字符的支持很差。
- 解析HTML时要配置好编码和基础属性,避免乱码或解析失败:
ConverterProperties props = new ConverterProperties(); props.setCharset("UTF-8"); // 如果HTML里有相对路径的资源,还需要设置baseUri // props.setBaseUri("http://your-domain.com/"); PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outputStream)); Document doc = new Document(pdfDoc); HtmlConverter.convertToDocument(htmlContent, doc, props); doc.close();
可以先拿一段极简HTML(比如<h1>Test PDF</h1>)测试,排除复杂HTML标签导致的解析错误。
内容的提问来源于stack exchange,提问作者Frakcool
相关产品推荐
相关产品推荐

