Http 错误状态:无法设置内容类型为“0”的请求的正文字段;应用程序/json“; Map headers={'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='; var response=wait post(url.getToken, 标题:标题, 正文:{“授权类型”:“密码”,“用户名”:“*******”,“密码”:“****”,“范围”:“脱机访问”}, );
当我执行此操作时,我无法接收数据,并且抛出错误Http 错误状态:无法设置内容类型为“0”的请求的正文字段;应用程序/json“; Map headers={'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='; var response=wait post(url.getToken, 标题:标题, 正文:{“授权类型”:“密码”,“用户名”:“*******”,“密码”:“****”,“范围”:“脱机访问”}, );,http,dart,flutter,Http,Dart,Flutter,当我执行此操作时,我无法接收数据,并且抛出错误 错误状态:无法设置内容类型为“application/json”的请求的正文字段。您需要将正文包装在jsonEncode中 Map<String,String> headers = {'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='}; var response = await post(Urls.get
错误状态:无法设置内容类型为“application/json”的请求的正文字段。您需要将正文包装在
jsonEncode
中
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"},
);
import'package:http/http.dart'作为http;
导入“dart:convert”;
映射头={'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw='};
final msg=jsonEncode({“授权类型”:“密码”,“用户名”:“*******”,“密码”:“****”,“范围”:“脱机访问”});
var response=wait post(url.getToken,
标题:标题,
主体:味精,
);
在http库中也有类似的问题…针对dio 2.1.0进行了更改,标题的问题消失了
jsonEncode(body)没有做到这一点,因为文档中说:
将具有给定标头和正文的HTTP POST请求发送到给定的
URL,可以是[Uri]或[String]
[body]设置请求的正文。它可以是[字符串],也可以是[列表]
或[地图]。如果是字符串,则使用
[编码]并用作请求的主体。文件的内容类型
请求将默认为“文本/普通”
如果[body]是一个列表,它将用作
请求
如果[body]是一个映射,则使用[encoding]将其编码为表单字段。这个
请求的内容类型将设置为
“应用程序/x-www-form-urlencoded”
;这不能被覆盖。
[编码]默认为[utf8]
要对请求进行更细粒度的控制,请改用[send]
futurepost(url,{Map headers,body,Encoding});
Map header={'Content-Type':'application/json patch+json','accept':'application/json'};
final msg=jsonEncode({“用户名”:“$emailorPhoneN”,“密码”:“$passwrod”});
试一试{
var response=wait http.post(urlstants.loginUrl,headers:header,body:msg,
).超时(持续时间(秒:httpDuration));
var convert=json.decode(response.body);
打印(“*******来自服务器$convert的数据”);
if(convert==null){
返回null;
}否则{
字符串标记=转换['token'];
if(令牌!=null){
SignUpModel SignUpModel=SignUpModel.fromJson(转换);
返回注册模型;
}否则{
//***从API提供程序获取错误消息。。。。。
SignUpModel SignUpModel=SignUpModel.fromJson(转换);
返回注册模型;
}
}
使用jsonecode
包裹你的身体对象
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;
}
}
为什么jsonecode
?
正文:它可以是[String]、[List]或[Map]。它使用编码进行编码并用作请求正文。请求的内容类型默认为“text/plain”
但是由于您将内容类型设置为json
,因此必须将json作为主体传递
但是您将Map
作为主体传递,这显然会抛出一个错误
因此,要解决此问题,您必须通过使用jsonecode
将映射更改或编码为json
(json字符串)。异常是由不正确设置bodyFields引起的。
见:
bodyFields用于表单编码的数据,而不是JSON。
有关如何发布JSON的示例,请参见:
因此,您试图将映射作为主体传递。在本例中,它将假定您实际上正在执行一个应用程序/x-www-form-urlencoded
。您需要做的是将映射编码为字符串,然后执行您正在执行的操作
范例
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()
);
未来补丁(
字符串url、映射参数、字符串标记)异步{
var responseJson;
试一试{
最终响应=等待http.patch(Uri.parse(url),
正文:JSONECODE(参数),
标题:{
“授权”:令牌,
“内容类型”:“应用程序/json”
}).超时(常数持续时间(秒:60),
onTimeout:()=>抛出TimeoutException(
'连接超时,请重试!');
responseJson=响应;
}论SocketException{
抛出FetchDataException(“您未连接到internet”);
}论时间例外{
打印(“超时”);
抛出TimeoutException(“连接已超时,请重试”);
}
返回响应;
}
try-body:json.encode({“授权类型”:“密码”、“用户名”:“****”、“密码”:“****”、“范围”:“脱机访问”}),
注意,你也发布了你的用户名/密码
,即使他们可能是测试用户,这不是一个好的做法…谢谢!起初我没有看到你的答案和问题之间的区别,但现在我明白了关键是用jsonEncode包装地图文字
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;
}
}
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()
);
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;
}