在Spring Boot Rest Controller中处理压缩的json请求

andy.codes:

我一直在尝试处理RequestBody,它是作为GZIP发送的JSON数据。在我的RestController中,我有以下方法:

@RequestMapping(value = "/api/data", method = RequestMethod.POST)
public ResponseEntity<String> updateData(@RequestBody String data) {
    System.out.println(data);

    return new ResponseEntity(HttpStatus.CREATED);
}

发送到控制器的“数据”是经过GZIP处理的JSON,当我打印时,所有数据都已编码。如何解码/解压缩该数据?

andy.codes:

最后,我从不同的来源放弃了答案。这是一个例子:

@Component
public class GzipBodyDecompressFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        request = new GzippedInputStreamWrapper((HttpServletRequest) servletRequest);

        chain.doFilter(request, response);
    }

    final class GzippedInputStreamWrapper extends HttpServletRequestWrapper {

        public static final String DEFAULT_ENCODING = "ISO-8859-1";

        private byte[] bytes;

        public GzippedInputStreamWrapper(final HttpServletRequest request) throws IOException {
            super(request);
            try {
                final InputStream in = new GZIPInputStream(request.getInputStream());
                bytes = IOUtils.toByteArray(in);
            } catch (EOFException e) {
                bytes = new byte[0];
            }
        }

        @Override
        public ServletInputStream getInputStream() throws IOException {
            final ByteArrayInputStream sourceStream = new ByteArrayInputStream(bytes);
            return new ServletInputStream() {
                public int read() throws IOException {
                    return sourceStream.read();
                }

                @Override
                public void setReadListener(ReadListener listener) {
                    // TODO Auto-generated method stub

                }

                @Override
                public boolean isFinished() {
                    // TODO Auto-generated method stub
                    return false;
                }

                @Override
                public boolean isReady() {
                    // TODO Auto-generated method stub
                    return false;
                }

                public void close() throws IOException {
                    super.close();
                    sourceStream.close();
                }
            };
        }

        @Override
        public Map getParameterMap() {
            return super.getParameterMap();
        }
    }
}

doFilter方法将在到达控制器之前执行,在该控制器中,我可以对请求的主体执行任何操作(因为我可以访问ServletRequest),例如,为HttpServletRequestWrapper创建一个实现,在其中解压缩内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Rest Controller无法在Spring Boot App中识别GET请求

Spring Boot Rest:json 问题

Spring Boot REST API-请求超时?

Spring Boot Rest Controller非常慢的响应

用于Spring Boot Rest Controller的Junit

Spring Boot REST服务异常处理

Spring Boot REST端点不返回JSON

Spring Boot REST API中的对象数组

Spring Boot Rest Controller:返回默认错误JSON

Spring Boot Rest Controller API未返回JSON

在Spring Boot中处理Rest控制器中的异常

在Spring Boot中未调用Rest Controller方法

使用Kotlin解决Spring Boot Rest Controller中的单例

Spring Boot从服务中调用Rest Controller方法

Spring Boot REST仅在JSON响应中显示父代的ID

在Spring Boot REST中无法从Hibernate POJO返回JSON

Spring Boot Rest服务| 请求方法“ GET”不受支持

如何使用Spring Boot验证每个REST请求

基于请求参数的Spring Boot Rest API国际化

Spring Boot Rest端点通过获取请求返回null

Spring Boot Rest Controller如何返回不同的HTTP状态代码?

Spring Boot REST Controller Integration Test返回406而不是500

Spring Boot:无法访问localhost上的REST Controller(404)

如何从Spring Boot Rest Controller获取状态描述

无法测试 Spring Boot Rest Controller(附加堆栈跟踪)

如何为特定的Rest Controller禁用Spring Boot Authentication控制

如何在 Spring Boot Rest Controller 中使用多个参数?

Spring Boot覆盖默认的REST异常处理程序

如何正确处理来自服务的异常(spring boot rest)