Futterベース(11)ネットワーク要求(Dio)とJSONデータ解析
14033 ワード
この文章は初めて公衆号で発表された「劉望舒」である.
React Native入門シリーズReact NativeコンポーネントFutter基礎シリーズ
前言
Android開発において、私達がネットワークを要求するなら、HttpClont、HttpURLConnectを使用することができますが、プロジェクトではOkHttpとRetrofitが一般的に使われます.Futterでも、システムはHttp Clientを提供していますが、プロジェクトでは主にhttpとDioなどの第三者ライブラリを使用しています.もっと多くの第三のライブラリを見つけたいなら、pb.dartlang.org/上で希望のライブラリを検索できます.本記事はDioを例にとり、JSONデータ解析に関する知識を紹介します.
1.Dioの使用入門
ディオは、強力なDart Httpリクエストライブラリであり、ブロック、グローバル構成、FormData、キャンセル、ファイルダウンロード、タイムアウトなどをサポートしています.
依存をpbspec.yamlに追加します.
2.Dioアクセスネットワークの例
3.JSONデータ解析
よく使われるJSONデータ解析方式は主に3つあります.ここでそれぞれ紹介します.
3.1 Json.decodeを使用する方法
第2小節の例としては、json.decodeの方法が用いられており、dart:convertライブラリを導入する必要がある.json.decode()方法は、StringタイプのデータをMapデータ構造に解析します.
3.2マニュアル作成エンティティ類
データをシリアル化するために、一つのmodelでデータを保存します.私たちは新しいip.dartを作ることができます.
3.3エンティティクラスを自動的に生成する
普通のプロジェクトの中でJsonデータは比較的に多いことができて、毎回実体種類の模版コードを繰り返し書いて明らかに味気なくて意味がなくて、いくつかツールを使って実体種類を生成することができます.例えば、ウェブページを使って自動的に生成されます.ap.quicktype.io/です.変換するエンティティクラスを以下に示します.
Json_を使うserializableは上記のツールの他に、jsonを使用することができます.serializableJsonserializableは自動化されたソースコード生成器であり、JSONエンティティクラスを生成するのに便利である.まずpbspec.yamlに次のような依存を入れます.
FutterベースシリーズFutterベース(一)移動開発のクロスプラットフォーム技術の進化Futterベース(二)Futter開発環境構築とハローWorld Futter基礎(三)Dart高速入門Futter基礎(四)開発Futterアプリケーション前に習得する必要があるBaic Widget Futter基礎(五)MaterialコンポーネントのMaterial Apper、Scaffuter、ベース(4)Batter Bater 6MaterialコンポーネントのBottom NavigationBar、TabBar、DrawerFutter基礎(7)Scrrolling WidgetのListView、GridView、PageView Futter基礎(8)ジェスチャー関連Widget:Gesture DetectorとDimissibleFuter基礎(9)リソースとFuter基礎レイアウト要求(Futter 10)JSONデータ解析Futterベース(12)ルート(ページジャンプ)とデータ転送Futterベース(13)FutterとAndroidの相互通信
ここでは大きな先端、Android、Javaなどの技術を共有するだけでなく、プログラマの成長タイプの文章もあります.
転載先:https://juejin.im/post/5d3eecba6fb9a06b155d97ba
React Native入門シリーズReact NativeコンポーネントFutter基礎シリーズ
前言
Android開発において、私達がネットワークを要求するなら、HttpClont、HttpURLConnectを使用することができますが、プロジェクトではOkHttpとRetrofitが一般的に使われます.Futterでも、システムはHttp Clientを提供していますが、プロジェクトでは主にhttpとDioなどの第三者ライブラリを使用しています.もっと多くの第三のライブラリを見つけたいなら、pb.dartlang.org/上で希望のライブラリを検索できます.本記事はDioを例にとり、JSONデータ解析に関する知識を紹介します.
1.Dioの使用入門
ディオは、強力なDart Httpリクエストライブラリであり、ブロック、グローバル構成、FormData、キャンセル、ファイルダウンロード、タイムアウトなどをサポートしています.
依存をpbspec.yamlに追加します.
dependencies:
dio: 2.1.7
公式サイトは簡単な例を示しています.import 'package:dio/dio.dart';
void getHttp() async {
try {
Response response = await Dio().get("http://liuwangshu.com");
print(response);
} catch (e) {
print(e);
}
}
GET要求を送信する場合:Response response;
response=await dio.get("/test?id=3&name=liuwangshu")
print(response.data.toString());
// , :
response=await dio.get("/test",data:{"id":3,"name":"liuwangshu"})
print(response.data.toString());
POST要求を送信します.response=await dio.post("/test",data:{"id":3,"name":"liuwangshu"})
FormDataを送信:FormData formData = new FormData.from({
"name": "liuwangshu",
"age": 18,
});
response = await dio.post("/info", data: formData);
まだたくさんの例があります.github.com/flunterchin...2.Dioアクセスネットワークの例
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var _ipAddress = 'Unknown';
_getIPAddress() async {//1
var url = 'https://httpbin.org/ip';
Dio _dio = Dio();
String result;
try {
var response = await _dio.get(url);//2
if (response.statusCode == HttpStatus.ok) {
var data= jsonDecode(response.toString());//3
result = data['origin'];
} else {
result =
'Error getting IP status ${response.statusCode}';
}
} catch (exception) {
result =exception.toString();
}
if (!mounted) return;
setState(() {
_ipAddress = result;//4
});
}
@override
Widget build(BuildContext context) {
var spacer = SizedBox(height: 10.0);
return Scaffold(
body: Padding(
padding: EdgeInsets.all(100.0),
child: Column(
children: [
Text('IP :'),
spacer,
Text('$_ipAddress'),
spacer,
RaisedButton(
onPressed: _getIPAddress,
child: Text(' '),
),
],
),
),
);
}
}
asyncとawaitはDart言語で非同期プログラムをサポートするキーワードであり、注釈1のasyncキーワードは_get IPAddress方法は非同期方法となり、注釈2におけるawaitキーワードは非同期方法でのみ使用でき、注釈2における後のコードはget要求が戻ってから実行される.ネットワーク要求が返された状態コードが200であれば、コメント3でJson解析を行い、結果をreult変数に割り当てます.私たちは画面上のボタンをクリックすると、_を呼び出します.getIPAddres方法は、注釈4において、要求された結果を評価する.ipAddressはTextに表示されます.ネットワーク要求が成功したら、効果は下図のようになります.3.JSONデータ解析
よく使われるJSONデータ解析方式は主に3つあります.ここでそれぞれ紹介します.
3.1 Json.decodeを使用する方法
第2小節の例としては、json.decodeの方法が用いられており、dart:convertライブラリを導入する必要がある.json.decode()方法は、StringタイプのデータをMapデータ構造に解析します.
Map
、データを取るフォーマットはobject[key]です.上記の例で返したJOSNデータは、{
"origin": "111.193.7.70, 111.193.7.70"
}
複雑ではないJOSNデータに対してJson.decodeを使うのはいい選択ですが、実際のプロジェクトのJOSNデータは複雑です.毎回データを取る時はobject[key]を使うと間違えやすいです.3.2マニュアル作成エンティティ類
データをシリアル化するために、一つのmodelでデータを保存します.私たちは新しいip.dartを作ることができます.
class Ip {
String origin;
Ip(this.origin);
Ip.fromJson(Map json) : origin = json['origin'];
Map toJson() => {
"origin": origin,
};
}
そしてメールを修正します.import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'model/ip.dart';
...
class _MyHomePageState extends State<MyHomePage> {
var _ipAddress = 'Unknown';
_getIPAddress() async {
var url = 'https://httpbin.org/ip';
Dio _dio = Dio();
String result;
try {
var response = await _dio.get(url);
if (response.statusCode == HttpStatus.ok) {
var data= jsonDecode(response.toString());
var ip=Ip.fromJson(data);//1
result = ip.origin;
}
...
}
...
}
注記1箇所はIp.from Jsonでipの本体を取得することができます.そうすると、赋価などの操作が完了します.3.3エンティティクラスを自動的に生成する
普通のプロジェクトの中でJsonデータは比較的に多いことができて、毎回実体種類の模版コードを繰り返し書いて明らかに味気なくて意味がなくて、いくつかツールを使って実体種類を生成することができます.例えば、ウェブページを使って自動的に生成されます.ap.quicktype.io/です.変換するエンティティクラスを以下に示します.
import 'dart:convert';
Ip ipFromJson(String str) => Ip.fromJson(json.decode(str));
String ipToJson(Ip data) => json.encode(data.toJson());
class Ip {
String origin;
Ip({
this.origin,
});
factory Ip.fromJson(Map json) => new Ip(
origin: json["origin"],
);
Map toJson() => {
"origin": origin,
};
}
ウェブページを使って生成する以外に、オープンソースのJSONFormat 4 Futter:github.com/debuggargerx 01…Json_を使うserializableは上記のツールの他に、jsonを使用することができます.serializableJsonserializableは自動化されたソースコード生成器であり、JSONエンティティクラスを生成するのに便利である.まずpbspec.yamlに次のような依存を入れます.
dependencies:
json_annotation: ^2.4.0
dev_dependencies:
build_runner: ^1.0.0
json_serializable: ^3.0.0
ASのTerminalでflunter packages getコマンドを実行して、これらの新しい依存項をプロジェクトに使用します.次に、ipエンティティクラスを実現します.import 'package:json_annotation/json_annotation.dart';
// ip.g.dart
part 'ip.g.dart';
// , Model
@JsonSerializable()
class Ip{
Ip(this.origin);
String origin;
factory Ip.fromJson(Map json) => _$IpFromJson(json);
Map toJson() => _$IpToJson(this);
}
重要なのは@Json Serializable()で、Ip類は生成が必要なModel類であることをジェネレータに教えます.Terminalウィンドウでは、以下のコマンドでip.g.dartファイルを生成します.flutter packages pub run build_runner build
どのように3.2節を見ればいいですか?json_を使います.serializableは、Ipクラスの任意のマニュアルJSONのプログレッシブを無視することができます.ソースコード生成器は、同じディレクトリでIp.g.dartを生成します.以下に示します.// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'ip.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Ip _$IpFromJson(Map json) {
return Ip(json['origin'] as String);
}
Map _$IpToJson(Ip instance) =>
{'origin': instance.origin};
このファイルには必要なプログレッシブロジックがあります.現在Futterの公式推奨はjson_を使うことです.serializableFutterベースシリーズFutterベース(一)移動開発のクロスプラットフォーム技術の進化Futterベース(二)Futter開発環境構築とハローWorld Futter基礎(三)Dart高速入門Futter基礎(四)開発Futterアプリケーション前に習得する必要があるBaic Widget Futter基礎(五)MaterialコンポーネントのMaterial Apper、Scaffuter、ベース(4)Batter Bater 6MaterialコンポーネントのBottom NavigationBar、TabBar、DrawerFutter基礎(7)Scrrolling WidgetのListView、GridView、PageView Futter基礎(8)ジェスチャー関連Widget:Gesture DetectorとDimissibleFuter基礎(9)リソースとFuter基礎レイアウト要求(Futter 10)JSONデータ解析Futterベース(12)ルート(ページジャンプ)とデータ転送Futterベース(13)FutterとAndroidの相互通信
ここでは大きな先端、Android、Javaなどの技術を共有するだけでなく、プログラマの成長タイプの文章もあります.
転載先:https://juejin.im/post/5d3eecba6fb9a06b155d97ba