flutter http 请求客户端

2018-12-28  本文已影响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"));
});
...
上一篇下一篇

猜你喜欢

热点阅读