Map<String,String> headers = {'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='};
var response = await post(Urls.getToken,
headers: headers,
body: {"grant_type":"password","username":"******","password":"*****","scope":"offline_access"},
);
执行此操作时,我无法接收数据,并且抛出的错误是
状态错误:无法设置内容类型为“ application / json”的请求的正文字段
答案 0 :(得分:8)
用jsonEncode
包裹你的身体object
。
import 'package:http/http.dart' as http;
import 'dart:convert';
var headers = {
'Content-Type':'application/json',
'authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='
};
final body = {
'username':'foo',
'password':'pass123'
}
var response = await post(
Urls.getToken,
headers: headers,
body: jsonEncode(body), // use jsonEncode()
);
为什么是jsonEncode
?
body:它可以是[String]、[List]或[Map
但是因为您将 content-type
设置为 json
,所以您必须传递一个 JSON 作为正文。
但是您将 Map<String, String>
作为正文传递,这显然会引发错误。
因此,要解决此问题,您必须使用 Map<String, String>
将 json
更改或编码为 jsonEncode
(JSON 字符串)。
答案 1 :(得分:0)
基本上就是Fayaz先前所说的话。
import 'package:http/http.dart' as http;
import 'dart:convert';
Map<String,String> headers = {'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='};
final msg = jsonEncode({"grant_type":"password","username":"******","password":"*****","scope":"offline_access"});
var response = await post(Urls.getToken,
headers: headers,
body: msg,
);
答案 2 :(得分:0)
http库也有类似问题...已更改为dio 2.1.0,并且标头的问题已消失。
jsonEncoede(body)并没有解决问题,因为文档说:
将具有给定标头和正文的HTTP POST请求发送到给定 URL,可以是[Uri]或[String]。
[body]设置请求的主体。它可以是[String],[List] 或[地图]。如果是字符串,则使用 [encoding]并用作请求的主体。的内容类型 请求将默认为“文本/纯文本”。
如果[body]是列表,则用作[body]主体的字节列表。 请求。
如果[body]是Map,则使用[encoding]将其编码为表单字段。的 请求的内容类型将设置为
"application/x-www-form-urlencoded"
;这不能被覆盖。 [encoding]默认为[utf8]。要对请求进行更细粒度的控制,请改用[send]。
Future<Response> post(url, {Map<String, String> headers, body, Encoding encoding});
答案 3 :(得分:0)
Map<String,String> header = {'Content-Type':'application/json-patch+json','accept':'application/json'};
final msg = jsonEncode({"username":"$emailorPhoneN","password":"$passwrod"});
try {
var response = await http.post(UrlConstants.loginUrl, headers: header, body: msg,
).timeout(Duration(seconds: httpDuration));
var convert = json.decode(response.body);
print('**********Data from server $convert');
if (convert == null) {
return null;
} else {
String token = convert['token'];
if (token != null) {
SignUpModel signUpModel = SignUpModel.fromJson(convert);
return signUpModel;
} else {
//*** GET Error message from the API provider.....
SignUpModel signUpModel = SignUpModel.fromJson(convert);
return signUpModel;
}
}
答案 4 :(得分:0)
异常是由错误地设置 bodyFields 引起的。 请参阅:bodyFields
bodyFields 用于表单编码数据,而不是JSON。 有关如何 POST JSON 的示例,请参阅:Write HTTP servers
因此,您尝试将 Map 作为主体传递。在这种情况下,它会假设您实际上是在执行 application/x-www-form-urlencoded
。您需要做的是将 Map
编码为字符串,然后执行您正在执行的操作。
示例
Future<http.Response> patchAPICall(
String url, Map param, String token) async {
var responseJson;
try {
final response = await http.patch(Uri.parse(url),
body: jsonEncode(param),
headers: {
"Authorization": token,
"Content-Type": "application/json"
}).timeout(const Duration(seconds: 60),
onTimeout: () => throw TimeoutException(
'The connection has timed out, Please try again!'));
responseJson = response;
} on SocketException {
throw FetchDataException("You are not connected to internet");
} on TimeoutException {
print('Time out');
throw TimeoutException("The connection has timed out, Please try again");
}
return responseJson;
}