【问题标题】:Rest Api to Decrypt GZIP BodyRest Api 解密 GZIP 正文
【发布时间】:2019-04-08 10:08:34
【问题描述】:

一个API正在以GZIP的形式在body中发送大量数据,我需要创建rest API来解密并保存在数据库中,但是我无法解密数据。

`@GetMapping
    public void hello() throws IOException {
        String payload = "{\n" +
                "    \"name1\": \"shrikant\",\n" +
                "    \"date\": \"Fri Apr 05 15:48:59 IST 2019\"\n" +
                "}";
        String urlStr = "http://localhost:8080/hello";
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(60000);
        conn.setConnectTimeout(60000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestProperty("Accept", "application/json");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.addRequestProperty("Content-Encoding", "gzip");
        OutputStream os = conn.getOutputStream();
        GZIPOutputStream gos = new GZIPOutputStream(os);
        gos.write(payload.getBytes(StandardCharsets.UTF_8));
        System.out.println("payload " + 
        Arrays.toString(payload.getBytes(StandardCharsets.UTF_8)));
        os.close();
        int responseCode = conn.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Response Code : " + responseCode);
    }`

用于接收数据的 API。

     @PostMapping("hello")
    public byte[] hello1(HttpServletRequest request) throws IOException {
        System.out.println("hi");
        ByteArrayInputStream bis = new ByteArrayInputStream();
        GZIPInputStream gis = new GZIPInputStream(bis);
        BufferedReader br = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line = br.readLine()) != null) {
            sb.append(line);
        }
    }

但无法解密数据。

  • 如何解密请求。

【问题讨论】:

标签: java rest gzip


【解决方案1】:

在客户端,您应该在关闭 OutputStream 之前关闭 GZIPOutputStream。

    gos.close();
    os.close();

在服务器端,您应该使用来自请求的 InputStream

    ServletInputStream inputStream = request.getInputStream();
    GZIPInputStream gis = new GZIPInputStream(inputStream);
    BufferedReader br = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
    StringBuilder sb = new StringBuilder();
    String line;
    while((line = br.readLine()) != null) {
        sb.append(line);
    }

    System.out.println(sb.toString());

对于流,最好使用 try-with-resources 块,您不必记住关闭流。

    try (OutputStream os = conn.getOutputStream()) {
        try (GZIPOutputStream gos = new GZIPOutputStream(os)) {
            gos.write(payload.getBytes(StandardCharsets.UTF_8));
        }
    }

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多