Rest Api для расшифровки тела GZIP - PullRequest
1 голос
/ 08 апреля 2019

API отправляет большой объем данных в теле в виде GZIP, мне нужно создать оставшийся 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);
        }
    }

, но не может расшифровать данные.

  • как расшифровать запрос.

1 Ответ

2 голосов
/ 09 апреля 2019

На стороне клиента вы должны закрыть GZIPOutputStream перед закрытием OutputStream.

    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блок ресурсов, вам не нужно будет помнить о закрытии потоков.

    try (OutputStream os = conn.getOutputStream()) {
        try (GZIPOutputStream gos = new GZIPOutputStream(os)) {
            gos.write(payload.getBytes(StandardCharsets.UTF_8));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...