常見網絡請求庫彙總

概述:

  全部網絡庫的原理是: 網絡請求通常是基於HttpURLConnection和HttpClient進行封裝的,也有本身編寫Socket實現的,好比ion和OkHttp;請求的執行通常是經過線程池來管理,異步請求獲得結果,則經過回調接口接收;而且通常接收結果的回調都經過Handler去在主線程執行java

幾大網絡請求庫:

  • Ion:Android Asynchronous Networking and Image Loading
  • Volley:谷歌官方推出的網絡請求和圖片加載庫
  • Retrofit:Square開源的基於OKHttp的性能良好更安全的類庫

Ion的使用

詳情查看Github主頁https://github.com/koush/ionandroid

  • 介紹:
    • 它支持網絡請求和進行圖片加載的雙重功能
    • 擁有鏈式api風格(Fluent API)
    • 當Activity結束的時候支持自動的取消操做
    • 支持SPDY/HTTP2,緩存,Gzip壓縮,HTTP鏈接的重用等
    • 而且是基於AndroidAsync實現的,AndroidAsync是做者的另外一個使用socket實現的,遵循http協議的類庫
  • 添加依賴git

    dependencies {
        compile 'com.koushikdutta.ion:ion:2.+'
    }
  • 使用ion進行get請求github

    Ion.with(this)
       .load(Api.TEST)
       .asString()//以字符串形式返回,服務器返回的都是流,只是類庫將流轉爲字符串了
       .setCallback(callback);//設置接收結果的回調接口
    
        FutureCallback<String> callback = new FutureCallback<String>() {
        /**
         * 回調是在主線程執行的,因此能夠直接更新UI
         * @param e
         * @param result
         */
        @Override
        public void onCompleted(Exception e, String result) {
            text.setText(e == null ? result : e.getMessage());
        }
    };
  • 使用ion進行post請求,提交key-value形式的參數apache

    Ion.with(this)
       .load(Api.LOGIN)
       .setBodyParameter("username","俊哥")//設置請求參數
       .setBodyParameter("password","123")
       .asString()
       .setCallback(callback);
  • 使用ion進行post請求,提交json對象參數json

    //構造json對象
    JsonObject json = new JsonObject();
    json.addProperty("city","北京");
    json.addProperty("year","2016");
    
    Ion.with(this)
       .load(Api.POST_JSON)
       .setJsonObjectBody(json)
       .asString()
       .setCallback(callback);
  • 使用ion進行上傳文件,並顯示進度api

    File file = new File(Environment.getExternalStorageDirectory(),"dog.jpg");
    
    Ion.with(this)
            .load(Api.UPLOAD)
            .uploadProgress(new ProgressCallback() {
                @Override
                public void onProgress(long downloaded, long total) {
                    int percent = (int) (downloaded*100f/total+0.5f);
                    Log.e("tag","上傳進度:"+percent+"%");
                }
            })
            .setMultipartFile("file",file)
            .asString()
            .setCallback(callback);
  • 使用ion進行下載文件,而且顯示進度緩存

    File file = new File(Environment.getExternalStorageDirectory(),"a.jpg");
    Ion.with(this)
            .load(Api.IMAGE)
            .progress(new ProgressCallback() {
                @Override
                 public void onProgress(long downloaded, long total) {
                    int percent = (int) (downloaded*100f/total+0.5f);
                    text.setText("下載進度:"+percent+"%");
                }
            })
            .write(file)
            .setCallback(new FutureCallback<File>() {
                @Override
                public void onCompleted(Exception e, File file) {
                    text.setText("下載成功:"+file.getAbsolutePath());
                }
            });

Retrofit的使用

詳情查看https://github.com/square/retrofit安全

  • 介紹服務器

    • Square公司爲Android開源的類型安全的Http客戶端
    • 底層基於OkHttp,使用OkHttp進行請求
    • 將java API的定義轉換爲interface形式
    • 使用annotation描述http請求
    • 支持配置json解析器
  • 添加依賴

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
  • 建立Retrofit實例對象

    //建立Retrofit
    Retrofit retrofit = new Retrofit.Builder()
            //注意,服務器主機應該以/結束,
            .baseUrl("http://192.168.2.103:8080/apitest/")//設置服務器主機
            .addConverterFactory(GsonConverterFactory.create())//配置Gson做爲json的解析器
            .build();
  • 定義業務邏輯接口

    public interface HeiMaApi {
        /**
         * 定義了一個業務方法,獲取訂單,
         */
        @GET("test")//指定該方法要請求的url,注意方法的路徑不要以/開頭,如/test,是錯誤的
        Call<Stu> getOrder();
    }
  • 建立接口實例對象

    HeiMaApi heiMaApi = retrofit.create(HeiMaApi.class);
  • 獲取業務方法的調用對象,並進行請求

    //調用業務方法,獲得要執行的業務請求對象
    Call<Stu> order = heiMaApi.getOrder();
    
    //執行請求對象
    //1.同步執行,獲得響應對象,會阻塞UI,不推薦
    //Response<Stu> response = order.execute();
    //Stu stu = response.body();
    //2.異步執行業務方法
    order.enqueue(new Callback<Stu>() {
        @Override
        public void onResponse(Call<Stu> call, Response<Stu> response) {
            Stu stu = response.body();
            text.setText(stu.toString());
        }
        @Override
        public void onFailure(Call<Stu> call, Throwable t) {
        }
    });
  • Retrofit的url註解處理

    • 使用@Path註解來處理url路徑不固定的需求,如

      @GET("test/{order}")//獲取訂單的某段路徑不固定,
      Call<Stu> getOrder(@Path("order")String order);
    • 使用@Query註解來替換url後面跟的參數,如:

      //url爲:test?id=333
      //使用@Query來替換查詢參數
      @GET("test")
      Call<Stu> getOrderById(@Query("id") String id);
    • 使用@QueryMap來替換多個查詢參數,如

      //假設url爲:login?username=heima&password=111
      //使用@QueryMay來替換多個查詢參數
      @GET("login")
      Call<Stu> login(@QueryMap Map<String,String> map);
    • 使用@Post註解進行post請求,提交key-value數據,如

      @FormUrlEncoded//配置對請求體參數進行url編碼
      @POST("login")
      Call<Login> postLogin(@Field("username")String username, @Field("password")String password);
    • 使用@Post註解進行post請求,提交json數據,如

      //使用@Body設置請求體參數
      //注意,@Body不須要配置@FormUrlEncoded或者@Multipart
      @POST("login")
      Call<Login> postJson(@Body JsonObject jsonObject);
    • 使用@Headers定義請求頭,如

      //定義請求頭
      @Headers({
              "Accept: application/vnd.github.v3.full+json",
              "User-Agent: Retrofit-Sample-App"
      })
    • 使用ResponseBody來接收流的數據,好比下載文件

      //下載文件
      @GET("image")
      Call<ResponseBody> getImage();
    • 使用@Muptipart和@Part或者@PartMao封裝多塊請求體

      //上傳文件和其餘參數
      @Multipart//將請求體進行Multipart拼接
      @POST("uploadMulti") //RequestBody表示數據和數據類型的封裝體
      //Call<UploadResult> upload(@Part("file") RequestBody       file,@Part("params1") RequestBody params1);
      //或者使用@PartMap
      Call<UploadResult> upload(@PartMap Map<String, RequestBody> map);

      須要注意的是,構建RequestBody的時候要注意拼接:

      File file = new File(Environment.getExternalStorageDirectory(),"a.jpg");
      File file2 = new File(Environment.getExternalStorageDirectory(),"dog.jpg");
      RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"),file);
      RequestBody fileBody2 = RequestBody.create(MediaType.parse("image/jpeg"),file2);
      
      HashMap<String,RequestBody> map = new HashMap<>();
      map.put("file\"; filename=\""+file.getName(),fileBody);
      map.put("file\"; filename=\""+file2.getName(),fileBody2);
      
      Call<UploadResult> uploadResultCall = HeiMaClient.create().heiMaApi.upload(map);
      uploadResultCall.enqueue(new Callback<UploadResult>() {
          @Override
          public void onResponse(Call<UploadResult> call, Response<UploadResult> response) {
              text.setText(response.body().toString());
          }
          @Override
          public void onFailure(Call<UploadResult> call, Throwable t) {
      
          }
      });

Volley的使用

  • 介紹
    • 谷歌開源的,專一於處理高頻率的數據比較小的請求
    • 內部仍然是使用的HttpURLConnection和HttpClient進行網絡請求的,只是對於不一樣的Android版本進行了響應的切換,2.3以前使用的HttpClient,2.3以後使用的是HttpURLConnection
    • 支持取消請求
    • 具備網絡請求和圖片加載的功能
  • 添加依賴

    compile 'com.android.volley:volley:1.0.0'
  • 建立RequestQueue請求隊列,它是用來執行請求對象的

    RequestQueue queue = Volley.newRequestQueue(this);
  • 建立請求對象,這裏使用最簡單的StringRequest:

    StringRequest stringRequest = new StringRequest(Api.TEST, new com.android.volley.Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            text.setText(response);
        }
    }, new com.android.volley.Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
    
        }
    });
  • 執行請求,將Request對象添加到RequestQueue中,便可

    //3.執行請求
    queue.add(stringRequest);
  • 使用JsonRequest進行請求,返回的是json對象

    //1.建立JsonRequest請求
    JsonObjectRequest joRequest = new JsonObjectRequest(url, null, new Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            tv_result.setText(response.toString());
        }
    }, new MyErrorListener());
    //2.執行請求
    queue.add(joRequest);
  • 使用Volley發送post請求,須要本身重寫Request的getParams方法

    public class PostReuqest extends StringRequest {
        private Map<String, String> params;
        public PostReuqest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
            super(url, listener, errorListener);
        }
        public PostReuqest(int method,String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
            super(method,url, listener, errorListener);
        }
        public void setParams(Map<String, String> params){
            this.params = params;
        }
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return params;
        }
    }
    
    PostReuqest stringRequest = new PostReuqest(Request.Method.POST,Api.LOGIN, new com.android.volley.Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            text.setText(response);
        }
    }, new com.android.volley.Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
    
        }
    });
    HashMap<String,String> map = new HashMap<>();
    map.put("username","hehehe");
    map.put("password","12321");
    stringRequest.setParams(map);

網絡請求總結

Anroid原生網絡請求

  • HttpURLConnention: 谷歌原生提供的用於網絡請求的輕量級方案,支持數據壓縮;缺點是封裝性差,使用起來麻煩,尤爲是作multipart提交的時候須要本身拼接符合http協議的請求參數;另外HttpURLConnection在2.3版本如下有bug,具體是關閉流的時候會致使線程池的線程沒法中止;2.3以上修復了該bug。
  • HttpClient: 谷歌原生內置的apache的HttpClient請求庫,功能多樣,缺點是API設計繁多,使用起來麻煩,隨着OkHttp愈來愈流行,谷歌決定在android4.4之後的版本,廢除HttpClient,並且HttpURLConnection的底層實現也採用的OkHttp;

第三方網絡請求庫

  • Retrofit: Square公司出品,基於OkHttp封裝,增長了動態代理和數據解析的封裝;支持多種數據格式的解析如json,xml等;因爲使用了動態代理,因此更安全,api風格和OkHttp類似;
  • OkHttp: Square公司出品,底層封裝Socket實現,特色是多個網絡請求重用一個Socket長鏈接,而且使用鏈接池來緩存鏈接,因此網絡延時低,請求高效穩定;支持http2和SPDY協議;使用OkIO進行讀寫操做,因爲OkIO底層使用NIO,因此讀寫更高效;
  • Ion: 也是優秀的網絡庫,底層一樣是封裝Socket使用,重用長鏈接,維護鏈接池;支持多種數據格式的解析返回;Api設計簡潔好用;可是流行程度沒有OkHttp高。
  • Volley:谷歌官方在2012年開發者大會推出的網絡庫,特色是適合處理請求頻繁可是數據量小的場景。自己對文件上傳支持比較差,須要本身編寫代碼。底層實現是在2.3以前使用HttpClient,2.3以後使用HttpURLConnection;同時具備加載圖片的功能,圖片加載模塊沒有實現圖片的內存緩存,須要咱們本身實現;
  • XUtil: 快速開發綜合框架,擁有ViewInject,DB,網絡請求,圖片加載4個模塊。網絡模塊底層封裝的HttpURLConnection,知名度沒有OkHttp高。
相關文章
相關標籤/搜索