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.変更要求ヘッダ
  • 一.インストール
      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)
    );