The getter 'length' was called on null in post request - flutter

I'm trying to make a post request to an API, and I couldn't get why this is happening.
This is my code:
print('THIS IS PRINTING');
var response = await http.post(url, body: body, headers: header);
print('This not printing (throwing error before it prints)');
This is the error that I'm getting:
I/flutter ( 2417): NoSuchMethodError: The getter 'length' was called on null.
I/flutter ( 2417): Receiver: null
I/flutter ( 2417): Tried calling: length
I'm able to make the request using PostMan, and giving the same fields and values, I get this error on dart. I'm also able to make other get requests without any issues.
Full code:
void getFavorites() async {
var url = "https://www.my-url-edited.com/favorite";
var header = {
"Content-Type": "application/x-www-form-urlencoded",
"token": "my token ---- edited",
};
var body = {
"car_id": "1",
"boat_id": null,
"habitation_id": null,
"product_id": null,
};
try {
print('print before post request --- working');
// var response = await http.post(url, body: body, headers: header);
var response = await http.post(url, body: body, headers: header);
print('This not printing (throwing error before it prints)');
print(response.body);
// var data = json.decode(response.body);
} catch (e) {
print(e);
throw Exception('Not connected to network');
}
}

you header should be ,
headers: {'Content-type': 'application/json','Accept': 'application/json'}

Try
var header = {
"Content-Type": "application/json",
"token": "my token ---- edited",
};
var body = jsonEncode({
"car_id": "1",
});

Related

Getting empty response body from a http post request to an api

This is my code. The goal is to get the link with file id.
// body parameter
Map<String, dynamic> body = {'file_id': 123};
String jsonBody = json.encode(body);
// response request
var download_response = await http.post(
Uri.parse('https://api.opensubtitles.com/api/v1/download'),
headers: {
'Content-Type': 'application/json',
'Api-Key': 'yCTZwGASncUthpMkMkbQDjcUdrrM2r8v'
},
body: jsonBody,
);
// print
debugPrint(download_response.body.toString());
I think I should be getting a JSON data response which I'm getting properly with postman but in flutter I'm getting empty response.
Things I tried:
encoding the body with jsonencode
correct syntax formatting
writing the body in plain json string
var headers = {
'Api-Key': 'yCTZwGASncUthpMkMkbQDjcUdrrM2r8v',
'Content-Type': 'application/json'
};
var request = http.MultipartRequest('POST', Uri.parse('https://api.opensubtitles.com/api/v1/download'));
request.fields.addAll({
'file_id': '123'
});
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
print(await response.stream.bytesToString());
}
else {
print(response.reasonPhrase);
}

Patch method using dio with xxx-www-form-urlencoded produces internal server error

So, i have been trying to update user data using the patch method. The data should be of
xxx-www-form-urlencoded
Also there are two additional headers required by laravel :
Accept : application/vnd.api+json,
Content-Type : application/vnd.api+json
But when i try to use the patch method in dio it produces 500 status code error.
This is the code for the patch request :
Future<CustomerResponse> editCustomer(
String id, AddCustomerModel addCustomerModel) async {
print(addCustomerModel.toMap());
var box = await Hive.openBox("tokenBox");
String token = box.get("token");
FormData formData = FormData.fromMap({
"name": addCustomerModel.name,
"consumerType": addCustomerModel.consumerType,
"corporateType": addCustomerModel.corporateType ?? "",
"amc": addCustomerModel.amc,
"amcDate": addCustomerModel.amcDate ?? "",
"address": addCustomerModel.address,
"phoneNo[]": addCustomerModel.phoneNo,
});
try {
Response response = await dio.patch(
"${Config.baseUrl}${Config.appFunctionRoute}/id",
data: formData,
options:
Options(contentType: Headers.formUrlEncodedContentType, headers: {
"Authorization": "Bearer $token",
"Accept": "application/vnd.api+json",
"Content-Type": "application/vnd.api+json"
}));
if (response.statusCode == 200) {
return CustomerResponse.fromJson(response.data);
}
} catch (e) {
print(e);
}
return CustomerResponse();
}
So , should i change something in the server side or there is something wrong from my end.

How do i Authorize myself to GET User Api [duplicate]

The post request is throwing an error while setting the header map.
Here is my code
Future<GenericResponse> makePostCall(
GenericRequest genericRequest) {String URL = "$BASE_URL/api/";
Map data = {
"name": "name",
"email": "email",
"mobile": "mobile",
"transportationRequired": false,
"userId": 5,
};
Map userHeader = {"Content-type": "application/json", "Accept": "application/json"};
return _netUtil.post(URL, body: data, headers:userHeader).then((dynamic res) {
print(res);
if (res["code"] != 200) throw new Exception(res["message"][0]);
return GenericResponse.fromJson(res);
});
}
but I'm getting this exception with headers.
══╡ EXCEPTION CAUGHT BY GESTURE ╞═
flutter: The following assertion was thrown while handling a gesture:
flutter: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, String>'
flutter:
flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
flutter: more information in this error message to help you determine and fix the underlying cause.
flutter: In either case, please report this assertion by filing a bug on GitHub:
flutter: https://github.com/flutter/flutter/issues/new?template=BUG.md
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0 NetworkUtil.post1 (package:saranam/network/network_util.dart:50:41)
flutter: #1 RestDatasource.bookPandit (package:saranam/network/rest_data_source.dart:204:21)
Anybody facing this issue? I didn't find any clue with the above log.
Try
Map<String, String> requestHeaders = {
'Content-type': 'application/json',
'Accept': 'application/json',
'Authorization': '<Your token>'
};
You can try this:
Map<String, String> get headers => {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": "Bearer $_token",
};
and then along with your http request for header just pass header as header
example:
Future<AvatarResponse> getAvatar() async {
var url = "$urlPrefix/api/v1/a/me/avatar";
print("fetching $url");
var response = await http.get(url, headers: headers);
if (response.statusCode != 200) {
throw Exception(
"Request to $url failed with status ${response.statusCode}: ${response.body}");
}
var avatar = AvatarResponse()
..mergeFromProto3Json(json.decode(response.body),
ignoreUnknownFields: true);
print(avatar);
return avatar;
}
I have done it this way passing a private key within the headers. This will also answer #Jaward:
class URLS {
static const String BASE_URL = 'https://location.to.your/api';
static const String USERNAME = 'myusername';
static const String PASSWORD = 'mypassword';
}
In the same .dart file:
class ApiService {
Future<UserInfo> getUserInfo() async {
var headers = {
'pk': 'here_a_private_key',
'authorization': 'Basic ' +
base64Encode(utf8.encode('${URLS.USERNAME}:${URLS.PASSWORD}')),
"Accept": "application/json"
};
final response = await http.get('${URLS.BASE_URL}/UserInfo/v1/GetUserInfo',
headers: headers);
if (response.statusCode == 200) {
final jsonResponse = json.decode(response.body);
return new UserInfo.fromJson(jsonResponse);
} else {
throw Exception('Failed to load data!');
}
}
}
Try this
Future<String> createPost(String url, Map newPost) async {
String collection;
try{
Map<String, String> headers = {"Content-type": "application/json"};
Response response =
await post(url, headers: headers, body: json.encode(newPost));
String responsebody = response.body;
final int statusCode = response.statusCode;
if (statusCode == 200 || statusCode == 201) {
final jsonResponse = json.decode(responsebody);
collection = jsonResponse["token"];
}
return collection;
}
catch(e){
print("catch");
}
}
Future<String> loginApi(String url) async {
Map<String, String> header = new Map();
header["content-type"] = "application/x-www-form-urlencoded";
header["token"] = "token from device";
try {
final response = await http.post("$url",body:{
"email":"test#test.com",
"password":"3efeyrett"
},headers: header);
Map<String,dynamic> output = jsonDecode(response.body);
if (output["status"] == 200) {
return "success";
}else{
return "error";
} catch (e) {
print("catch--------$e");
return "error";
}
return "";
}
void getApi() async {
SharedPreferences prefsss = await SharedPreferences.getInstance();
String tokennn = prefsss.get("k_token");
String url = 'http://yourhost.com/services/Default/Places/List';
Map<String, String> mainheader = {
"Content-type": "application/json",
"Cookie": tokennn
};
String requestBody =
'{"Take":100,"IncludeColumns":["Id","Name","Address","PhoneNumber","WebSite","Username","ImagePath","ServiceName","ZoneID","GalleryImages","Distance","ServiceTypeID"],"EqualityFilter":{"ServiceID":${_radioValue2 != null ? _radioValue2 : '""'},"ZoneID":"","Latitude":"${fav_lat != null ? fav_lat : 0.0}","Longitude":"${fav_long != null ? fav_long : 0.0}","SearchDistance":"${distanceZone}"},"ContainsText":"${_txtSearch}"}';
Response response = await post(url , headers: mainheader ,body:requestBody);
String parsedata = response.body;
var data = jsonDecode(parsedata);
var getval = data['Entities'] as List;
setState(() {
list = getval.map<Entities>((json) => Entities.fromJson(json)).toList();
});
}

How can pass the request parameter as a formdata in dart or flutter

I have tried many formats to pass the request parameter in the flutter project but I'm getting API status code 415 and Unhandled Exception: FormatException: Unexpected end of input (at character 1).
I have added the postman image for the understanding of the form data.
For Flutter HTTP library it goes like this,
var headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
var request = http.Request('POST', Uri.parse(''));
request.bodyFields = {
'firstName': 'Keval',
'lastName': 'ebiz',
'email': 'al#gmail.com',
'phone': '1234'
};
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
print(await response.stream.bytesToString());
}
else {
print(response.reasonPhrase);
}

How to format body for form-data header

This might be probably already answered question but I can not find one. How do we format data body for form-data http response? I tried to encode it to json but that didn't work with error
Unhandled Exception: Multipart: Boundary not found
Future<void> createProfile() async {
final body = {
"firstName": "first",
"lastName": "last",
"image": "path-to-image"
};
try {
final http.Response response = await http.post(APIPath.createProfile(),
headers: {"Authorization": "Bearer $token","Content-Type": "multipart/form-data"},
body: json.encode(body)); //<-- this doesn't work
final jsonResponse = json.decode(response.body);
if (response.statusCode != 201) {
throw HttpException(jsonResponse["error"]);
}
} catch (error) {
throw error;
}
}
Flutter Documentation
var uri = Uri.parse('https://example.com/create');
var request = http.MultipartRequest('POST', uri)
..headers['authorization'] = 'auth header value'
..fields['user'] = 'nweiz#google.com'
..files.add(await http.MultipartFile.fromPath(
'package', 'build/image.png',
contentType: MediaType('image', '*')));
var response = await request.send();
if (response.statusCode == 200) print('Uploaded!');