網絡通信框架之okHttpUtils


okHttpUtils封裝庫志支持:

  • 一般的get請求
  • 一般的post請求
  • 基於Http的文件上傳
  • 文件下載
  • 上傳下載的進度回調
  • 加載圖片
  • 支持請求回調,直接返回對象、對象集合
  • 支持session的保持
  • 支持自簽名網站https的訪問,提供方法設置下證書就行
  • 支持取消某個請求

基本方法的使用 :

第一步:

注入依賴:compile 'com.zhy:okhttputils:2.0.0'

第二步:添加網絡權限

基本的用法格式為:

OkHttpUtils
    .get()
    .url(url)
    .addParams("username", "hyman")
    .addParams("password", "123")
    .build()
    .execute(callback);

通過鏈式去根據自己的需要添加各種參數,最后調用execute(callback)進行執行,傳入callback則代表是異步。如果只是execute()則代表同步的方法調用。


GET請求

String url = "http://www.csdn.net/";
OkHttpUtils
    .get()
    .url(url)
    .addParams("username", "hyman")
    .addParams("password", "123")
    .build()
    .execute(new StringCallback()
            {
                @Override
                public void onError(Request request, Exception e)
                {

                }

                @Override
                public void onResponse(String response)
                {

                }
            });

POST請求

OkHttpUtils
    .post()
    .url(url)
    .addParams("username", "hyman")
    .addParams("password", "123")
    .build()
    .execute(callback);
 
        
Post String
OkHttpUtils
    .postString()
    .url(url)
    .content(new Gson().toJson(new User("zhy", "123")))
    .build()
    .execute(new MyStringCallback()); 
將string作為請求體傳入到服務端,例如json字符串

 


Post File

 

OkHttpUtils
    .postFile()
    .url(url)
    .file(file)
    .build()
    .execute(new MyStringCallback());
將file作為請求體傳入到服務端.
 
        
基於POST的文件上傳(類似web上的表單)
OkHttpUtils.post()//
    .addFile("mFile", "messenger_01.png", file)//
    .addFile("mFile", "test1.txt", file2)//
    .url(url)
    .params(params)//
    .headers(headers)//
    .build()//
    .execute(new MyStringCallback());

 


下載文件

OkHttpUtils//
    .get()//
    .url(url)//
    .build()//
    .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")//
    {
        @Override
        public void inProgress(float progress)
        {
            mProgressBar.setProgress((int) (100 * progress));
        }

        @Override
        public void onError(Request request, Exception e)
        {
            Log.e(TAG, "onError :" + e.getMessage());
        }

        @Override
        public void onResponse(File file)
        {
            Log.e(TAG, "onResponse :" + file.getAbsolutePath());
        }
    });
 
        
 
        

顯示圖片

OkHttpUtils
    .get()//
    .url(url)//
    .build()//
    .execute(new BitmapCallback()
    {
        @Override
        public void onError(Request request, Exception e)
        {
            mTv.setText("onError:" + e.getMessage());
        }

        @Override
        public void onResponse(Bitmap bitmap)
        {
            mImageView.setImageBitmap(bitmap);
        }
    });
 
        
 
        

對於上傳下載的回調

new Callback<?>()
{
    //...
    @Override
    public void inProgress(float progress)
    {
       //use progress: 0 ~ 1
    }
}

對於傳入的callback有個inProgress方法,需要拿到進度直接復寫該方法即可。

 
        
 
        
對於自動解析為實體類
目前去除了Gson的依賴,提供了自定義Callback的方式,讓用戶自己去解析返回的數據,
目前提供了StringCallbackFileCallback,BitmapCallback 分別用於返回string,文件下載,加載圖片。
當然如果你希望解析為對象,你可以:
    public abstract class UserCallback extends Callback<User>
    {
        //非UI線程,支持任何耗時操作
        @Override
        public User parseNetworkResponse(Response response) throws IOException
        {
            String string = response.body().string();
            User user = new Gson().fromJson(string, User.class);
            return user;
        }
    
 自己使用自己喜歡的Json解析庫完成即可。
    解析成List<User>,則如下:

    public abstract class ListUserCallback extends Callback<List<User>>
    {
        @Override
        public List<User> parseNetworkResponse(Response response) throws IOException
        {
            String string = response.body().string();
            List<User> user = new Gson().fromJson(string, List.class);
            return user;
        }

    }
 
        
 
        
 
        
 對於https單向認證
 非常簡單,拿到xxx.cert的證書。然后調用
OkHttpUtils.getInstance().setCertificates(inputstream);
 
        

 建議使用方式,例如我的證書放在assets目錄:

    public class MyApplication extends Application
    {
        @Override
        public void onCreate()
        {
            super.onCreate();

            try
            {    
            OkHttpUtils
             .getInstance()
             .setCertificates(getAssets().open("aaa.cer"),
     getAssets().open("server.cer"));
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
 
        

 即可。別忘了注冊Application。

注意:如果https網站為權威機構頒發的證書,不需要以上設置。自簽名的證書才需要。

 
        
 
        

配置

(1)全局配置

可以在Application中,通過:
OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
 
        
然后調用client的各種set方法。如:
client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);

(2)為單個請求設置超時

比如涉及到文件的需要設置讀寫等待時間多一點。

 OkHttpUtils
    .get()//
    .url(url)//
    .tag(this)//
    .build()//
    .connTimeOut(20000)
    .readTimeOut(20000)
    .writeTimeOut(20000)
    .execute()
調用build()之后,可以隨即設置各種timeOut.

(3)取消單個請求

RequestCall call = OkHttpUtils.get().url(url).build();
 call.cancel();

(4)根據tag取消請求

目前對於支持的方法都添加了最后一個參數Object tag,取消則通過OkHttpUtils.cancelTag(tag)執行。

 例如:在Activity中,當Activity銷毀取消請求:

OkHttpUtils
    .get()//
    .url(url)//
    .tag(this)//
    .build()//

@Override
protected void onDestroy()
{
    super.onDestroy();
    //可以取消同一個tag的
    OkHttpUtils.cancelTag(this);//取消以Activity.this作為tag的請求
}

 比如,當前Activity頁面所有的請求以Activity對象作為tag,可以在onDestory里面統一取消。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM