美文网首页
flutter http 请求客户端

flutter http 请求客户端

作者: 渣渣曦 | 来源:发表于2018-12-28 10:53 被阅读0次

    1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/http#-installing-tab-”确认版本号后,将http(0.12.0或更高版本)添加到依赖项列表。

    2、在Android Studio的编辑器视图中查看pubspec时,单击右上角的 Packages get,或者在命令行输入“flutter packages get”;这会将依赖包安装到您的项目。

    3、运行以下代码
    样例一

    import 'dart:async';
    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    
    Future<Post> fetchPost() async {
      final response =
          await http.get('https://jsonplaceholder.typicode.com/posts/1');
      final responseJson = json.decode(response.body);
    
      return new Post.fromJson(responseJson);
    }
    
    class Post {
      final int userId;
      final int id;
      final String title;
      final String body;
    
      Post({this.userId, this.id, this.title, this.body});
    
      factory Post.fromJson(Map<String, dynamic> json) {
        return new Post(
          userId: json['userId'],
          id: json['id'],
          title: json['title'],
          body: json['body'],
        );
      }
    }
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Fetch Data Example',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new Scaffold(
            appBar: new AppBar(
              title: new Text('Fetch Data Example'),
            ),
            body: new Center(
              child: new FutureBuilder<Post>(
                future: fetchPost(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    return new Text(snapshot.data.title);
                  } else if (snapshot.hasError) {
                    return new Text("${snapshot.error}");
                  }
                  // By default, show a loading spinner
                  return new CircularProgressIndicator();
                },
              ),
            ),
          ),
        );
      }
    }
    

    JSON请求样例片段代码

    ...
      TextEditingController usernameController = new TextEditingController();
      TextEditingController passwordController = new TextEditingController();
    ...
      TextField(controller: usernameController),
      TextField(controller: passwordController),
    ...
      login(usernameController.text,passwordController.text).then((token){
         print(token);
         SharedPreferences.getInstance().then((prefs){
         print(prefs.get("token"));
      });
    ...
    Future<dynamic> login(username,password) async{
      var url = "http://192.168.3.4/login/auth";
    //  headers.append('Access-Control-Allow-Headers', 'Content-Type');
      var map = new Map<String, dynamic>();
      map["LoginName"]=username;
      map["Password"]=password;
      var response = await http.post(url,
          headers: {HttpHeaders.contentTypeHeader: 'application/json'},
          body:jsonEncode(map));
      if (response.statusCode == 200) {
        var jsonResponse = jsonDecode(response.body);
        var ok = jsonResponse['ok'];
        if(ok){
          SharedPreferences prefs = await SharedPreferences.getInstance();
          await prefs.setString('token', jsonResponse['token']);
          return jsonResponse['token'];
        }else{
          print(jsonResponse['error']);
        }
      } else {
        print("Request failed with status: ${response.statusCode}.");
      }
    }
    ...
    

    JWT解析代码

    Map<String, dynamic> parseJwt(String token) {
      final parts = token.split('.');
      if (parts.length != 3) {
        throw Exception('invalid token');
      }
      final payload = _decodeBase64(parts[1]);
      final payloadMap = json.decode(payload);
      if (payloadMap is! Map<String, dynamic>) {
        throw Exception('invalid payload');
      }
      return payloadMap;
    }
    
    String _decodeBase64(String str) {
      String output = str.replaceAll('-', '+').replaceAll('_', '/');
      switch (output.length % 4) {
        case 0:
          break;
        case 2:
          output += '==';
          break;
        case 3:
          output += '=';
          break;
        default:
          throw Exception('Illegal base64url string!"');
      }
      return utf8.decode(base64Url.decode(output));
    }
    

    持久化存储
    1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/shared_preferences#-installing-tab-”确认版本号后,将shared_preferences(0.5.1+2或更高版本)添加到依赖项列表。

    2、在Android Studio的编辑器视图中查看pubspec时,单击右上角的 Packages get,或者在命令行输入“flutter packages get”;这会将依赖包安装到您的项目。

    3、 代码片段如下

    import 'package:shared_preferences/shared_preferences.dart';
    ...
    //存储token
    SharedPreferences prefs = SharedPreferences.getInstance();
    prefs.setInt('jwt', token);
    ...
    //读取token
    SharedPreferences.getInstance().then((prefs){
          print(prefs.get("token"));
    });
    ...
    

    相关文章

      网友评论

          本文标题:flutter http 请求客户端

          本文链接:https://www.haomeiwen.com/subject/gjkslqtx.html