Flutter - 网络请求与 json 解析

Flutter网络请求与JSON解析

Flutter网络请求与JSON解析

网络请求项目中用了两种,一个是 dart 自己的 dart:io, 另外一个是 dio 这个库。
json 解析则用的是 dart:convert

发起 HTTP 请求

首先我们需要先导入 http 的支持包,然后创建 httpClient

import 'dart:io';
var httpClient = new HttpClient();

HttpClient 支持常见的 get、post、put、delete 请求。

处理异步

众所周知,网络请求是耗时操作,所以我们需要进行异步操作,建议使用async/await语法来调用 API。

var httpClient = new HttpClient(); //创建Client
String dataUrl ="XXXXXXXX"; //构建uri
var uri = new Uri.http(
    'example.com', '/path1/path2', {'param1': '42', 'param2': 'foo'});//或者这么构建也可以
var request = await httpClient.getUrl(Uri.parse(dataUrl));//发起请求
var response = await request.close();//关闭连接
if (response.statusCode == HttpStatus.ok) {
  var jsonStr = await response.transform(utf8.decoder).join();
  print(jsonStr)

} else {
 print("请求失败");
}

JSON 解析

采用的是官网中描述的方法
使用dart:convert;
配合插件:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^2.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

由于这种解析方式不支持泛型,只能采用组合 + 继承的方式来实现了:

请求基类

import 'package:json_annotation/json_annotation.dart';
part 'base_result_bean.g.dart';

()
class BaseResultBean{
  BaseResultBean();
  String status;
  (name: "current_page")
  int currentPage;

  (name: "total_comments")
  int totalComments;
  (name: "page_count")
  int pageCount;
  int count;
  factory BaseResultBean.fromJson(Map<String, dynamic> json) =>_$BaseResultBeanFromJson(json);
  Map<String, dynamic> toJson() => _$BaseResultBeanToJson(this);
}

写个 model

import 'package:json_annotation/json_annotation.dart';
import 'base_result_bean.dart';
part 'joke_bean.g.dart';

()
class JokeModel extends BaseResultBean{
  JokeModel();
  List<JokeBean> comments;
  factory JokeModel.fromJson(Map<String, dynamic> json) => _$JokeModelFromJson(json);
  Map<String, dynamic> toJson() => _$JokeModelToJson(this);
}

()
class JokeBean {
  JokeBean();

  (name: "vote_positive")
  String votePositive;

  (name: "vote_negative")
  String voteNegative;

  (name: "sub_comment_count")
  String subCommentCount;
  factory JokeBean.fromJson(Map<String, dynamic> json) => _$JokeBeanFromJson(json);
  Map<String, dynamic> toJson() => _$JokeBeanToJson(this);
}

写完之后会报错,别慌,根目录下执行
flutter packages pub run build_runner build
这条命令每次改变实体类的时候都需要执行,可以换成
flutter packages pub run build_runner watch

现在,我们解析 json 就可以这么写了

if (response.statusCode == HttpStatus.ok) {
      var jsonStr = await response.transform(utf8.decoder).join();
      var boredImageModel = JokeModel.fromJson(json.decode(jsonStr));
}

如果是比较简单的 json 解析,可以直接通过 json.decode 进行处理,比如

{
  "name": "John Smith",
  "email": "[email protected]"
}

可以这么取

Map<String, dynamic> user = json.decode(jsonStr);
print('Howdy, ${user['name']}!');
print('We sent the verification link to ${user['email']}.');

在 flutter 中文网推荐了 dio 这个库,dio github,这里简单的使用了一下,并没有用到高级功能

pubspec.yaml 中添加依赖 dio: ^2.1.0, 导包:import ‘package:dio/dio.dart‘;

Future<void> getHttp(bool isLoadMore) async {
    if (isLoading) {
      return null;
    } else {
      setState(() {
        isLoading = true;
        if (!isLoadMore) {
          pageNumber = 1;
        }
      });
    }
    String dataUrl =
        "https://i.jandan.net/?oxwlxojflwblxbsapi=jandan.get_duan_comments&page=$pageNumber";
    try {
      Response<Map<String, dynamic>> response = await Dio().get(dataUrl);
      if (response.statusCode == 200) {
        var jokeModel = JokeModel.fromJson(response.data);

        setState(() {
          isLoading = false;
          pageNumber++;
          if (isLoadMore) {
            widgets.addAll(jokeModel.comments);
          } else {
            widgets = jokeModel.comments;
          }
        });
      } else {
        isLoading = false;
        _showError();
      }
    } catch (e) {
      print(e.toString());
    }
  }

一个简单的请求,并没有体现出 dio 的强势的地方,具体使用可以看一下
https://github.com/flutterchina/dio/blob/master/README-ZH.md 介绍。

原文地址:https://www.cnblogs.com/huiyou/p/11540005.html

时间: 2024-10-30 10:56:03

Flutter - 网络请求与 json 解析的相关文章

iOS 自己封装的网络请求,json解析的类

基本上所有的APP都会涉及网络这块,不管是用AFNetWorking还是自己写的http请求,整个网络框架的搭建很重要. 楼主封装的网络请求类,包括自己写的http请求和AFNetWorking的请求,代码简单,主要是框架搭建.简单来说,就是一个请求类,一个解析类,还有若干数据类. 以下代码以公开的天气查询api为例: 1.网络请求类 我把常用的网络请求方法都封装好了,你只需要写自己的接口,传递apiName,params等参数就可以. #pragma mark ios请求方式 //ios自带的

C#网络请求与JSON解析

最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C#中网络请求和数据处理的一些内容.大致流程为: 客户端发起登录请求: 服务端验证账号密码 返回json字符串,包含用户信息.平台配置等信息 客户端解析并初始化 一.发起GET请求 private string HttpGet(string api) { string serviceAddress =

网络请求之JSON解析

<一>JSON的基本知识 什么是JSON:JSON的全称是JavaScript Object Notation(JavaScript对象符号),是目前使用最广泛的数据交换格式,具有跨平台.跨语言的优势,而且对照XML,JSON作为数据传输格式时,数据传输量更小,JSON数据格式既适合人来进行读写,又适合计算机本身解析和合成 JSON的数据结构: 由key-value对组成的数据结构,这种数据结构在不同的语言中有不同的实现,例如:在JavaScript中是一个对象,在Objective-C中是一

android中网络请求数据,解析并添加到Listview中

今天我实现了网络请求数据,解析并将数据添加到Listview中.上个星期我有提到说要实现点击Listview中item实现不同的功能,还是没头绪.如有幸被阅读,希望指教一下.我用的是hTTPClient的post方法请求的数据.在实现请求之前,还有一个主activity跳转.代码如下: 请求activity代码: public class MachineInterface extends Activity { private ListView machineType; private Array

IOS - 网络(HTTP请求、同步请求、异步请求、JSON解析数据)

1 // 2 // ViewController.m 3 // IOS_0129_HTTP请求 4 // 5 // Created by ma c on 16/1/29. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 12 @interface ViewController

Swift 网络请求数据与解析

一: Swift 网络数据请求与处理最常用第三方 又有时间出来装天才了,还是在学swift,从中又发现一些问题,这两天上网找博客看问题弄的真的心都累.博客一篇写出来,好多就直接照抄,就没有实质性的把问题解决了,只是在发表的博客数量上 + 1 !!真心没意思.. 看看在Swift中是在怎样请求数据,解析数据加载图片这些的,也使我们最基本最常见的用法了,先说说这几个三方库: 第一个: Alamofire  (它的原作者就是AFNetworking的原作者,这个就不多说了,你要知道AFNetworki

网络请求和json解析

请求使用AFN框架,json解析使用MJExtension框架 封装网络请求考虑扩展性: 协议头:http,https等 服务器地址或域名 API路径 请求方式:get,post等 传递的输入参数类型也不同 注意点: 设置HTTP请求序列化的文件为json格式 json转模型MJExtention: Model *modelResult = [Model objectWithKeyValues:responseObject]; responseObject为服务器返回的json对象 自定义的模型

iOS网络编程开发—JSON解析与XML解析

一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从

iOS网络请求之数据解析

JSON解析 IOS中Json解析的四种方法 NSURLConnection-网络请求浅析 IOS开发:官方自带的JSON使用 XML 解析 GDataXMLNode应用 IOS学习:常用第三方库(GDataXMLNode:xml解析库) [IOS开发]GDataXML解析XML IOS学习之十六:网络数据的XML解析 https://github.com/huluo666/AFNetworkingTest https://github.com/hustbill/weatherTab iOS 操