Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to decode a Gzip Http Response in Flutter?

I am new to Flutter. I am making a Network Request and I am getting the correct response, but the data is Gzipped. I have decompressed the same in Swift, but with Flutter, I am unable to do that. Can anyone please help?

Here's what I have tried:

import 'dart:convert';
import 'package:http/http.dart';
import 'package:archive/archive.dart';
import 'package:flutter_app/Constants/constants.dart';

class ServiceHelper {

  static final sharedInstance = ServiceHelper();

  Future<Response> sendRequest({String path, Map<String,dynamic> params}) async {

    final String url = Constants.testURL+path;

    var body = jsonEncode(params);

    Response response = await post(url, body:body);

    final gZipped_data = GZipDecoder().decodeBytes(response.bodyBytes);

    print(gZipped_data); //flutter: [123, 34, 115, 116, 97, 116, 117, 115, 34, 58, 50, 48, 48, 44, 34, 109, 101, 115, 115, 97, 103, 101, 34, 58, 34, 83, 105, 103, 110, 32, 105, 110, 32, 67, 111, 109, 112, 108, 101, 116, 101, 100, 32, 83, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108, 121, 34, 44, 34, 100, 97, 116, 97, 34, 58, 123, 34, 117, 115, 101, 114, 95, 105, 110, 102, 111, 34, 58, 123, 34, 112, 108, 97, 121, 101, 114, 95, 105, 100, 34, 58, 49, 52, 56, 54, 57, 44, 34, 112, 108, 95, 97, 112, 112, 95, 105, 100, 34, 58, 34, 57, 90, 104, 57, 82, 66, 108, 70, 34, 44, 34, 112, 114, 111, 102, 105, 108, 101, 95, 112, 105, 99, 34, 58, 34, 104, 116, 116, 112, 115, 58, 92, 47, 92, 47, 119, 119, 119, 46, 115, 112, 111, 114, 116, 115, 113, 119, 105, 122, 122, 46, 99, 111, 109, 92, 47, 118, 51, 92, 47, 105, 109, 103, 92, 47, 112, 108, 97, 121, 101, 114, 115, 92, 47, 112, 105, 99, 92, 47, 105, 80, 45, 49, 53, 50, 51, 56, 54, 57, 50, 57, 56, 46, 112, 110, 103, 34, 44, 34, 101, 109, 97, 105, 108, 34, 58, 34, 116, 101, 99, 104, 121, <…>


   //This throws an error: Unhandled Exception: FormatException: Bad UTF-8 encoding 0x8b (at offset 1)

    return response;

  }


}

//This is the login function and it is in a different file main.dart

 Future<void> login(
      {String email,
      String name,
      int source,
      String sourceStr,
      String picString,
      String idToken}) async {
    final String playerID = '';

    final String token = await getIOSToken().then((token){

      return token;

    });

    Map<String, dynamic> params = {
      "email": email,
      "name": name,
      "player_id": playerID,
      "source_id": source,
      "profile_pic": picString,
      "password": passwordController.text ?? "",
      "ios_token":token,
      "device_type": "I",
      "language_iso": "en",
      "referred_by": "loginDefault",
      "firebase_id_token": idToken,
      "app_version": "4.4.9"
    };

    Response response = await ServiceHelper.sharedInstance
        .sendRequest(path: Constants.login, params: params);

    if (response.statusCode == 201) {
      // If server returns an OK response, parse the JSON.
      return UserDetails.fromJson(json.decode(response.body));
    } else {
      // If that response was not OK, throw an error.
      throw Exception('Failed to load post');
    }
  }

The expected response is JSON, but as it is Gzipped and I am unable to decompress it, I do not know how to get the JSON from it. I have tried decoding it and it gives me gzipped_data as a List of Integers as you can see above. How can I get the JSON from it?

like image 952
Rob13 Avatar asked Aug 17 '19 10:08

Rob13


People also ask

How do I decode a gzip file?

To open (unzip) a . gz file, right-click on the file you want to decompress and select “Extract”. Windows users need to install additional software such as 7zip to open . gz files.

How do I view gzip headers?

You can tell using Developer Tools (F12). Go to the Network tab, select the file you want to examine and then look at the Headers tab on the right. If you are gzipped, then you will see that in the Content-Encoding.

What is gzip http compression?

Gzip is a file format and software application used on Unix and Unix-like systems to compress HTTP content before it's served to a client.

What is deflate in HTTP?

In HTTP/1.1, Content-encoding: deflate actually refers to the DEFLATE compression algorithm, as defined by RFC 1951, wrapped in the zlib data format, as defined by RFC 1950. However some vendors just implement the DEFLATE algorithm as defined RFC 1951, completely ignoring RFC 1950 (no zlib headers).


2 Answers

I'm using GZipCodec from dart:io.

Try it like this to return the response as a String.

Future<String> sendRequest({String path, Map<String,dynamic> params}) async {

    final String url = Constants.testURL+path;

    var body = jsonEncode(params);

    Response response = await post(url, body:body);

    final decoded_data = GZipCodec().decode(response.bodyBytes);


    return utf8.decode(decoded_data, allowMalformed: true);

  }
like image 143
Er1 Avatar answered Oct 19 '22 13:10

Er1


The body of a response will be automatically uncompressed.

Visit https://api.flutter.dev/flutter/dart-io/HttpClient/autoUncompress.html

like image 2
Good man Avatar answered Oct 19 '22 11:10

Good man