Here's my code that should return a json. I adapted this code from here https://github.com/flutter/flutter/issues/15110
Stream _defaultReturn(HttpClientResponse httpClientResponse) {
Stream response = httpClientResponse.
transform(utf8.decoder).
transform(json.decoder).
asyncMap((json) => jsonDecode(json));
return response;
}
Future<dynamic> get(String endpoint) async {
HttpClientRequest httpClientRequest =
await httpClient.getUrl(Uri.parse(_url + endpoint));
_addCookies(httpClientRequest);
final HttpClientResponse httpClientResponse =
await httpClientRequest.close();
return _defaultReturn(httpClientResponse);
}
I've put a return type of Stream
into _defaultReturn
because intellisense told me that giant thing returned me a Stream
. I would actually want to receive a json (which should be a map). I think I migth consume or subscribe to this stream to get something useful. However, I don't see parsin json as stream as being useful. Don't I need the entire json before parsing? Shouldn't I simply accumulate everything into a String
and then simply call jsonDecode
?
Which is the most efficient way of returning a json from an http call? And how to do it?
json.decoder
will listen source stream and always transform its content to just one Object
, so you can just return it with stream's .first
:
Future<Object> get(String endpoint) async {
var httpClientRequest = await httpClient.getUrl(Uri.parse(_url + endpoint));
_addCookies(httpClientRequest);
final httpClientResponse = await httpClientRequest.close();
return httpClientResponse
.transform(utf8.decoder)
.transform(json.decoder)
.first;
}
Then you can use it like this:
var jsonObject = await myHttpClient.get(myEndpoint);
There is a package named JSON_Serializable that you could make use of. Generate your object class, and you could map your HTTP return to the class.
final response = await http.get(url, headers: await setHeaders());
dynamic parsed = jsonDecode(await response.body);
YourItemsList = List<YourItems>.from(
parsed['data'].map((i) => YourItems.fromJson(i)));
Your class generation will include both functions below:
factory YourItemsList.fromJson(Map<dynamic, dynamic> json) =>
_$YourItemsListFromJson(json);
Map<String, dynamic> toJson() => _$YourItemsListToJson(this);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With