I\'m trying to make an post request in flutter with content type as url encoded. When I write body : json.encode(data)
, it encodes to plain text.
If I
You need to add three additional steps: First, you need to convert the JSON map to a String (using json.encode) Then you need to Uri encode it if you want to send it as application/x-www-form-urlencoded. Lastly, you need to give the parameter that you are posting a name.
For example (note, this is using the dart:io HttpClient, but it's basically the same):
Future<HttpClientResponse> foo() async {
Map<String, dynamic> jsonMap = {
'homeTeam': {'team': 'Team A'},
'awayTeam': {'team': 'Team B'},
};
String jsonString = json.encode(jsonMap); // encode map to json
String paramName = 'param'; // give the post param a name
String formBody = paramName + '=' + Uri.encodeQueryComponent(jsonString);
List<int> bodyBytes = utf8.encode(formBody); // utf8 encode
HttpClientRequest request =
await _httpClient.post(_host, _port, '/a/b/c');
// it's polite to send the body length to the server
request.headers.set('Content-Length', bodyBytes.length.toString());
// todo add other headers here
request.add(bodyBytes);
return await request.close();
}
The above is for the dart:io
version (which, of course, you can use in Flutter)
If you would like to stick with the package:http
version, then you need to tweak your Map a bit. body
must be a Map<String, String>
. You need to decide what you want as your POST parameters. Do you want two: homeTeam and awayTeam? or one, say, teamJson?
This code
Map<String, String> body = {
'name': 'doodle',
'color': 'blue',
'homeTeam': json.encode(
{'team': 'Team A'},
),
'awayTeam': json.encode(
{'team': 'Team B'},
),
};
Response r = await post(
url,
body: body,
);
produces this on the wire
name=doodle&color=blue&homeTeam=%7B%22team%22%3A%22Team+A%22%7D&awayTeam=%7B%22team%22%3A%22Team+B%22%7D
alternatively, this
Map<String, String> body = {
'name': 'doodle',
'color': 'blue',
'teamJson': json.encode({
'homeTeam': {'team': 'Team A'},
'awayTeam': {'team': 'Team B'},
}),
};
Response r = await post(
url,
body: body,
);
produces this on the wire
name=doodle&color=blue&teamJson=%7B%22homeTeam%22%3A%7B%22team%22%3A%22Team+A%22%7D%2C%22awayTeam%22%3A%7B%22team%22%3A%22Team+B%22%7D%7D
the package:http
client takes care of: encoding the Uri.encodeQueryComponent, utf8 encoding (note that that's the default, so no need to specify it) and sending the length in the Content-Length header. You must still do the json encoding.
I suggest using the Dio library. It supports a lot with working with APIs.
With newest Dio version. Simply do the following:
BaseOptions options = new BaseOptions(
baseUrl: "https://www.xx.com/api",
connectTimeout: 5000,
receiveTimeout: 3000,);
Dio dio = new Dio(options);
//
Map<String, String> params = Map();
params['username'] = '6388';
params['password'] = '123456';
//
response = await dio.post("/login", data: FormData.fromMap(params));
I came here just trying to make an HTTP POST request. Here is an example of how to do that:
import 'dart:convert';
import 'package:http/http.dart';
makePostRequest() async {
final uri = 'http://httpbin.org/post';
final headers = {'Content-Type': 'application/json'};
Map<String, dynamic> body = {'id': 21, 'name': 'bob'};
String jsonBody = json.encode(body);
final encoding = Encoding.getByName('utf-8');
Response response = await post(
uri,
headers: headers,
body: jsonBody,
encoding: encoding,
);
int statusCode = response.statusCode;
String responseBody = response.body;
}
you need to use json.encode
example;
var match = {
"homeTeam": {"team": "Team A"},
"awayTeam": {"team": "Team B"}
};
var response = await post(Uri.parse(url),
headers: {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"
},
body: json.encode(match),
encoding: Encoding.getByName("utf-8"));
Map<String, String> body = {
'getDetails': 'true'
};
final response = await
http.post("https://example.com/", body: body);
if (response.statusCode == 200) {
//Your code
}
On the place of "UserModel" write the name of your model and do not pass String in the body it will create a problem using "Map" as given below.
static Future<UserModel> performUserLogin(String username, String password) async{
try{
Map<String, String> headers = {"Content-type": "application/json"};
Map<String, String> JsonBody = {
'username': username,
'password': password
};
print("The JSON Object is here $body");
// make POST request
final response = await http.post(loginAPIURL,body: JsonBody);
// check the status code for the result
int statusCode = response.statusCode;
print("Login calling $response");
if (statusCode == 200){
}else{
return null;
//return UserModel();
throw Exception("Error in login");
}
} catch (e) {
throw Exception(e);
}
}