Flutteが実用的で流行しているHTTPリクエストライブラリdio
30329 ワード
Dio 一. を取り付ける二.Dio APIS 1.BaseOptions基本構成 .要求タイプの別名 3.RequestOptions要求構成 4.ResponseとDioError 5.Interceptorsブロッキング 6.キャンセル要求 7.Proxyエージェント 三.具体例 1. post 2.Futureに合わせて複数のリクエストの実行を待つ 3.ダウンロードファイル 4.応答のタイプ を制御するためにOptionsのresponseTypeを設定する5.アップロードファイル 6.変更要求ヘッダ 一.インストール
二.Dio APIS
1.BaseOptionsの基本構成
2.要求タイプの別名
3.RequestOptionsリクエスト構成
これは特定の異なるリクエストで使用される構成であり、ベース構成BaseOptionsの基本とBaseOptionsの一致を上書きします.
4.ResponseとDioError
5.Interceptorsブロッキング
6.キャンセル要求
7.Proxyエージェント
三.具体例
1. post
2.Futureに合わせて複数のリクエストの実行を待つ
3.ファイルのダウンロード
4.OptionsのresponseTypeを設定して応答のタイプを制御する
5.ファイルのアップロード
6.変更要求ヘッダ
pubspec.yaml ,
dependencies:
dio: ^3.0.9
ctrl+s flutter pub get
二.Dio APIS
1.BaseOptionsの基本構成
//
import 'package:dio/dio.dart';
//
Dio dio=new Dio(BaseOptions(
method:"post", //
connectTimeout:1000, //
receiveTimeout:2000, //
sendTimeout:3000, //
// Url
baseUrl:"http://127.0.0.1:4200",
// url
queryParameters:{"name":"zs","age":20},
//
extra:{"sport":"run"},
//
headers:{"Content-Type":"application/json"},
//
// , 、
contentType:"text/plain;charset=UTF-8",
// ResponseType json
responseType: ResponseType.json,
// status
// true
// false
validateStatus:(status){
print(status);
return true;
},
//
followRedirects: true,
//
maxRedirects : 5,
));
2.要求タイプの別名
// :
dio.get(url).then((value)=>{
// value Response
})
dio.get() // get
dio.post() // post
dio.put() // put
dio.delete() // delete
dio.head() // head
dio.put() // put
dio.patch() // patch
dio.download() //
3.RequestOptionsリクエスト構成
これは特定の異なるリクエストで使用される構成であり、ベース構成BaseOptionsの基本とBaseOptionsの一致を上書きします.
4.ResponseとDioError
try {
dio.request("/test").then((value) => {
// value Response
// data
// Headers Headers
// request RequestOptions
// isRedirect
// statusCode
// statusMessage
print(value.data);
})
}on DioError catch(e) {
// , http , , DNS , 。
if(e.response) {
print(e.response.data)
print(e.response.headers)
print(e.response.request)
} else{
print(e.request)
print(e.message)
}
// response
// message
// type
// CONNECT_TIMEOUT
// RECEIVE_TIMEOUT
// RESPONSE
// CANCEL
// DEFAULT
}
5.Interceptorsブロッキング
dio.interceptors.add(InterceptorsWrapper(
// ?
onRequest:(RequestOptions options) async {
//
// : token
options.headers['token']="token";
// url options
options.queryParameters={"sprot":"run"};
// lock unlock
// 1. lock
dio.interceptors.requestLock.lock(); // dio.lock()
// 2. unlock ,
//
Timer(new Duration(seconds: 2),(){
print(" ");
dio.interceptors.requestLock.unlock(); // dio.unlock();
});
//
return options;
//
// return dio.reject(" ");
},
onResponse:(Response response) async {
// response
//
response.data=" :"+response.data;
return response;
},
onError: (DioError e) async {
//
//
e.error="My Error!!";
return e;
}
));
6.キャンセル要求
// CancelToken
CancelToken token = CancelToken();
//
dio.get(url1, cancelToken: token);
dio.get(url2, cancelToken: token);
// cancel()
token.cancel(" ");
7.Proxyエージェント
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate=(client){
client.findProxy=(uri){
// url dio url url
return "PROXY localhost:666";
};
};
三.具体例
1. post
// data
// data queryParameters :
// data queryParameters url
dio.post("/test", data: {"name":"Rob"},queryParameters: {
"age":22
}).then((value=>{
print(value);
}));
2.Futureに合わせて複数のリクエストの実行を待つ
//
Future.wait([dio.post("/task1"), dio.get("/task2")]).then((value)=>{
//
});
3.ファイルのダウンロード
// urlPath savePath
// path_provider
// path_provider
dio.download(urlPath, savePath).then((value) => {null});
4.OptionsのresponseTypeを設定して応答のタイプを制御する
// (Stream)
Response<ResponseBody> rs = await Dio().get<ResponseBody>(url,
options: Options(responseType: ResponseType.stream),
);
print(rs.data.stream);
// (bytes)
Response<List<int>> rs = await Dio().get<List<int>>(url,
options: Options(responseType: ResponseType.bytes),
);
print(rs.data);
5.ファイルのアップロード
// post data FormData /Map
// : Map FormData
var formData=FormData.fromMap({
"name": "Rob",
"age": 22,
//
"file": await MultipartFile.fromFile("./index.txt",filename: "simpleFile.txt"),
"files": [
await MultipartFile.fromFile("./index.txt",filename: "MultiFile1.txt"),
await MultipartFile.fromFile("./index.txt",filename: "MultiFile2.txt"),
]
});
// :
var formData = FormData();
formData.files.addAll([
MapEntry(
"files",
MultipartFile.fromFileSync("./upload.txt",
filename: "upload1.txt"),
),
MapEntry(
"files",
MultipartFile.fromFileSync("./upload.txt",
filename: "upload2.txt"),
),
]);
response = await dio.post("/getFile",
data: formData,
//
onSendProgress: (int sent, int total) {
print("$sent $total");
}
);
6.変更要求ヘッダ
// ,Dio ( ) JSON。
// , application / x-www-form-urlencoded
// : dio
dio.options.contentType= Headers.formUrlEncodedContentType;
// : JSON
dio.post("/index",
options: Options(contentType:Headers.formUrlEncodedContentType)
);