Flutter HTTP请求的头信息

31
post请求在设置头部映射时抛出错误。 这里是我的代码。
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);
});

}
但是我在处理头部时遇到了这个异常。
══╡ 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)

有人遇到这个问题吗?我在上面的日志中没有找到任何线索。


尝试将您的正文编码为JSON,例如 var body = json.encode({"foo": "bar"}); - Kunchok Tashi
6个回答

47

尝试

 Map<String, String> requestHeaders = {
       'Content-type': 'application/json',
       'Accept': 'application/json',
       'Authorization': '<Your token>'
     };

谢谢,@Sami Kanafani,它部分地解决了我的问题。 - Satya Attili
为什么只是部分地完成了,你现在的问题是什么? - Sami Kanafani
如果我们想将令牌传递到标头中,怎么办………感谢您的帮助。 - Jawad
@SamiKanafani - 谢谢,这解决了我的问题。不过我有一个问题,如果没有 <String, String>,我的代码似乎已经完成了,但是没有进行 REST 调用 - 我没有收到任何异常(与上面的示例不同),也没有 REST 响应(好或坏)。底层发生了什么导致这种情况? - rbinnun
我不是很明白,你的意思是你删除了<String,String>并且没有异常,但请求没有发送? - Sami Kanafani

15

您可以尝试这个:

Map<String, String> get headers => {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": "Bearer $_token",
      };

然后,在您的http请求头中,只需将头文件作为头文件传递。
例如:
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;
  }

4

我是这样做的,通过头文件传递一个私钥。这也能回答@Jaward的问题:

class URLS {
    static const String BASE_URL = 'https://location.to.your/api';
    static const String USERNAME = 'myusername';
    static const String PASSWORD = 'mypassword';
}

在同一个 .dart 文件中:
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!');
      }
    }
}

1
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 "";

}


1

试试这个

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");
  }

}

0
 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();
});
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接