
In this tutorial, we’re going to learn about how to make HTTP requests with flutter. To start with that, we need to create a flutter project
flutter create httpdemo
<span class="hljs-built_in">cd</span> httpdemo
What you’ll learn
- Read (GET) Data from the webserver
- POST data to a web server
This example, we’re going to use http://reqres.in/ as our server
To working with HTTP, we need to include the following package with our pubspec.yaml
file
<span class="hljs-symbol">dependencies:</span>
<span class="hljs-symbol"> flutter:</span>
<span class="hljs-symbol"> sdk:</span> flutter
<span class="hljs-symbol"> http:</span> ^<span class="hljs-number">0.12</span><span class="hljs-number">.0</span>+<span class="hljs-number">2</span>
<span class="hljs-symbol"> toast:</span> ^<span class="hljs-number">0.1</span><span class="hljs-number">.5</span>
HTTP helps you to make requests & toast allows you to display toast message.
Reading JSON with Flutter
First, we’re going to read user’s data from http://reqres.in/api/users. Response look like this
{
<span class="hljs-symbol"> page:</span> <span class="hljs-number">1</span>,
<span class="hljs-symbol"> per_page:</span> <span class="hljs-number">3</span>,
<span class="hljs-symbol"> total:</span> <span class="hljs-number">12</span>,
<span class="hljs-symbol"> total_pages:</span> <span class="hljs-number">4</span>,
<span class="hljs-symbol"> data:</span> [
{
<span class="hljs-symbol"> id:</span> <span class="hljs-number">1</span>,
<span class="hljs-symbol"> email:</span> <span class="hljs-string">"george.bluth@reqres.in"</span>,
<span class="hljs-symbol"> first_name:</span> <span class="hljs-string">"George"</span>,
<span class="hljs-symbol"> last_name:</span> <span class="hljs-string">"Bluth"</span>,
<span class="hljs-symbol"> avatar:</span> <span class="hljs-string">"http://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"</span>
},
{
<span class="hljs-symbol"> id:</span> <span class="hljs-number">2</span>,
<span class="hljs-symbol"> email:</span> <span class="hljs-string">"janet.weaver@reqres.in"</span>,
<span class="hljs-symbol"> first_name:</span> <span class="hljs-string">"Janet"</span>,
<span class="hljs-symbol"> last_name:</span> <span class="hljs-string">"Weaver"</span>,
<span class="hljs-symbol"> avatar:</span> <span class="hljs-string">"http://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"</span>
},
{
<span class="hljs-symbol"> id:</span> <span class="hljs-number">3</span>,
<span class="hljs-symbol"> email:</span> <span class="hljs-string">"emma.wong@reqres.in"</span>,
<span class="hljs-symbol"> first_name:</span> <span class="hljs-string">"Emma"</span>,
<span class="hljs-symbol"> last_name:</span> <span class="hljs-string">"Wong"</span>,
<span class="hljs-symbol"> avatar:</span> <span class="hljs-string">"http://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg"</span>
}
]
}
Let’s import the required packages first
<span class="hljs-keyword">import</span> <span class="hljs-string">'package:http/http.dart'</span> <span class="hljs-keyword">as</span> http;
<span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;
Since we’re working with JSON data, we need to import dart:convert
. Now we need to create a function which make a GET request with our URL
List _users = []<span class="hljs-comment">;</span>
getUsers() async {
http.get(<span class="hljs-string">"http://reqres.in/api/users"</span>).then((res) {
Map userData = json.decode(res.body)<span class="hljs-comment">;</span>
setState(() {
_users = userData[<span class="hljs-string">"data"</span>]<span class="hljs-comment">;</span>
})<span class="hljs-comment">;</span>
})<span class="hljs-comment">;</span>
}
Explanation:
- We created
_users
to store the response from server http.get(url)
received data & we have usedjson.decode
for converting response as JSON- once data is received, we’re updating
_users
Displaying data
<span class="hljs-variable">@override</span>
Widget build(BuildContext context) {
<span class="hljs-selector-tag">return</span> <span class="hljs-selector-tag">Scaffold</span>(
<span class="hljs-attribute">appBar</span>: AppBar(
<span class="hljs-attribute">title</span>: Text(<span class="hljs-string">"Users"</span>),
<span class="hljs-attribute">actions</span>: <Widget>[
IconButton(
<span class="hljs-attribute">icon</span>: Icon(Icons.refresh),
<span class="hljs-attribute">onPressed</span>: () => getUsers(),
)
],
),
<span class="hljs-attribute">body</span>: _users.length == <span class="hljs-number">0</span>
? Center(<span class="hljs-attribute">child</span>: Text(<span class="hljs-string">"No user Found"</span>))
: ListView.builder(
<span class="hljs-attribute">itemCount</span>: _users.length,
<span class="hljs-attribute">itemBuilder</span>: (context, index) {
return ListTile(
<span class="hljs-attribute">leading</span>: CircleAvatar(
<span class="hljs-attribute">backgroundImage</span>: NetworkImage(_users[index][<span class="hljs-string">'avatar'</span>])),
<span class="hljs-attribute">title</span>: Text(_users[index][<span class="hljs-string">'first_name'</span>] +
<span class="hljs-string">" "</span> +
_users[index][<span class="hljs-string">'last_name'</span>]),
);
},
),
);
}
Explanation:
- We’re checking
_users.length == 0
, if yes, we display no user found, otherwise, we display data with listview
Making HTTP POST
Now, we’re going to make an HTTP post request to http://reqres.in/api/register. for that we need
{
<span class="hljs-attr">"email"</span>: <span class="hljs-string">"eve.holt@reqres.in"</span>,
<span class="hljs-attr">"password"</span>: <span class="hljs-string">"pistol"</span>
}
Let’s create a simple form for receiving inputs from the user such as email and password
Map<String,String> _user = {};
<span class="hljs-meta">@override</span>
Widget build(BuildContext context) {
<span class="hljs-comment">// <span class="hljs-doctag">TODO:</span> implement build</span>
<span class="hljs-keyword">return</span> Scaffold(
<span class="hljs-symbol"> appBar:</span> AppBar(
<span class="hljs-symbol"> title:</span> Text(<span class="hljs-string">"Register"</span>),
),
<span class="hljs-symbol"> body:</span> Container(
<span class="hljs-symbol"> padding:</span> EdgeInsets.all(<span class="hljs-number">32.0</span>),
<span class="hljs-symbol"> child:</span> Column(
<span class="hljs-symbol"> crossAxisAlignment:</span> CrossAxisAlignment.start,
<span class="hljs-symbol"> children:</span> <Widget>[
TextField(<span class="hljs-string">decoration:</span> InputDecoration(<span class="hljs-string">hintText:</span> <span class="hljs-string">"Email"</span>), <span class="hljs-string">onChanged:</span>(val){
setState(() {
_user[<span class="hljs-string">'email'</span>] = val;
});
}),
TextField(<span class="hljs-string">obscureText:</span> <span class="hljs-literal">true</span> , <span class="hljs-string">decoration:</span> InputDecoration(<span class="hljs-string">hintText:</span> <span class="hljs-string">"Password"</span>), <span class="hljs-string">onChanged:</span>(val){
setState(() {
_user[<span class="hljs-string">'password'</span>] = val;
});
}),
OutlineButton(
<span class="hljs-symbol"> child:</span> Text(<span class="hljs-string">"Register"</span>),
<span class="hljs-symbol"> onPressed:</span> () {
register();
},
)
],
),
),
);
}
Explanation:
- We created
_user
variable for storing user info - We created TextField for getting email and password
- When user press register button we’re calling
register()
register(){
http.post(<span class="hljs-string">"http://reqres.in/api/register"</span>,
body: _user
).<span class="hljs-keyword">then</span>((res){
<span class="hljs-built_in">var</span> resJson = json.decode(res.body);
<span class="hljs-keyword">if</span>(resJson['<span class="hljs-built_in">error</span>'] != null){
Toast.<span class="hljs-built_in">show</span>(<span class="hljs-string">"Something Went wrong -> "</span> + resJson['<span class="hljs-built_in">error</span>'], <span class="hljs-built_in">context</span>, gravity: Toast.CENTER);
}
<span class="hljs-keyword">else</span>{
Toast.<span class="hljs-built_in">show</span>(<span class="hljs-string">"Registerd Successfully"</span>, <span class="hljs-built_in">context</span>, gravity: Toast.CENTER);
}
});
}
Explanation:
- we’re making requests using
http.post()
with URL & converted response to JSON. Based on the response we’re displaying toast message