如何在flutter Dio post请求中的授权标头中设置令牌

bla*_*ird 2 authorization access-token dart flutter

我想使用 Dio 在我的发布请求的授权标头中设置一个令牌。我尝试使用两个选项设置标题。而且两者都不起作用。第一种方式会引发错误,第二种方式不会将数据发送到服务器。从共享首选项添加授权令牌并将其作为发布请求上的标头发送的最佳方法是什么Dio()

当用户登录并访问它时,我将令牌保存在 SharedPreference 上:

String token = "";

  @override
  void initState() {
    getToken();
  }

  void getToken() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    token = prefs.getString("token");
    setState((){});
  }
Run Code Online (Sandbox Code Playgroud)

第一种方法用于发送带有标头的数据:

 Future<FormsModel> createEntry(
      String id,
      String formName,
      String dataContent,
      String dateCreated,
      String dateUpdated,
      String userLocation,
      String imeI,
      String updatedBy) async {
    String apiUrl = "http://10.0.2.2:8080/api/v1/entry";
    Dio().options.headers["Authorization"] = "Bearer $token";
    await Dio().post(apiUrl, data: {
      "id": id,
      "formName": formName,
      "dataContent": dataContent,
      "dateCreated": dateCreated,
      "dateUpdated": dateUpdated,
      "userLocation": userLocation,
      "imeI": imeI,
      "updatedBy": updatedBy
    });
Run Code Online (Sandbox Code Playgroud)

这会引发错误

未处理的异常:DioError [DioErrorType.RESPONSE]:Http 状态错误 [302]

第二种方法是将令牌添加到标头中:

Future<FormsModel> createEntry(
      String id,
      String formName,
      String dataContent,
      String dateCreated,
      String dateUpdated,
      String userLocation,
      String imeI,
      String updatedBy) async {
    String apiUrl = "http://10.0.2.2:8080/api/v1/entry";
    await Dio().post(apiUrl, data: {
      "id": id,
      "formName": formName,
      "dataContent": dataContent,
      "dateCreated": dateCreated,
      "dateUpdated": dateUpdated,
      "userLocation": userLocation,
      "imeI": imeI,
      "updatedBy": updatedBy
    },
    options: Options( headers: {"authorization": "Bearer $token"},
    followRedirects: false,
    validateStatus: (status) { return status < 500; }));
  }
Run Code Online (Sandbox Code Playgroud)

这样我就不会收到错误,但不会将数据发送到服务器。

GJJ*_*GJJ 6

尝试这样

 String apiUrl = "http://10.0.2.2:8080/api/v1";

 final dio = Dio(
    BaseOptions(
       connectTimeout: 30000,
       baseUrl: apiUrl',
       responseType: ResponseType.json,
       contentType: ContentType.json.toString(),
  ));

 dio.options.headers["Authorization"] = "Bearer $token";
 await dio.post("/entry" , data: {
  "id": id,
  "formName": formName,
  "dataContent": dataContent,
  "dateCreated": dateCreated,
  "dateUpdated": dateUpdated,
  "userLocation": userLocation,
  "imeI": imeI,
  "updatedBy": updatedBy
});
Run Code Online (Sandbox Code Playgroud)