NoHttp詳解之NoHttp最原生使用(無封裝)

參考博客:     點擊打開鏈接

 

  1. NoHttp詳細文檔:http://doc.nohttp.net

  2. NoHttp公益測試接口:http://api.nohttp.net

  3.  https://github.com/yanzhenjie/NoHttp


支持與RxJava完美結合、支持一句話切換底層爲OkHttp,支持緩存數據到數據庫或SD卡和數據庫,並對數據做了加密保護,支持請求Restful風格的接口,比Retrofit更簡單易用。

框架特性

  • 動態配置底層框架爲OkHttp、HttpURLConnection
  • RxJava完美結合,支持異步請求、支持同步請求
  • 多文件上傳,支持大文件上傳,表單提交數據
  • 文件下載、上傳下載、上傳和下載的進度回調、錯誤回調
  • 支持Json、xml、Map、List的提交
  • 完美的Http緩存模式,可指定緩存到數據庫、SD卡,緩存數據已安全加密
    • 在6.0以上手機緩存到SD卡時需要請求運行時權限:AndPermission
  • 自定義Request,直接請求JsonObject、JavaBean等
  • Cookie的自動維持,App重啓、關開機後還持續維持
  • http 301 302 303 304 307重定向,支持多層嵌套重定向
  • Https、自簽名網站Https的訪問、支持雙向驗證
  • 失敗重試機制,支持請求優先級
  • GET、POST、PUT、PATCH、HEAD、DELETE、OPTIONS、TRACE等請求協議
  • 用隊列保存請求,平均分配多線程的資源,支持多個請求併發
  • 支持取消某個請求、取消指定多個請求、取消所有請求

使用方法

AndroidStudio使用方式

  • 如果使用HttpURLConnection作爲網絡層:
compile 'com.yolanda.nohttp:nohttp:1.1.0'
如果要使用OkHttp作爲網絡層,請再依賴:

compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'

初始化

NoHttp初始化需要一個Context,最好在ApplicationonCreate()中初始化,記得在manifest.xml中註冊Application

一般初始化

直接初始化後,一切採用默認設置。

NoHttp.initialize(this);
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //NoHttp初始化
        NoHttp.initialize(this);
    }
}


get和post請求原生使用:

public class MainActivity extends AppCompatActivity {

    private TextView mTv;


    /***
     *  1.如果是mac,可以安裝jsonOnlineView
     *  2.如果是windows,postman,google的瀏覽器chrome的插件
     */

    private String postUrl = "https://api.bmob.cn/1/users";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv = (TextView) findViewById(R.id.tv);

    }

    /***
     * Nohttp的get方式
     * @param view
     */
    public void btn_get(View view){
        /**可以封裝到其他的地方*/
        String url = "http://www.baidu.com";
        //1.創建一個隊列
        /**也可以封裝,只需要一個隊列就夠了**/
        RequestQueue queue = NoHttp.newRequestQueue();
        //3.創建消息請求
        Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);


        //2.利用隊列去添加消息請求

        /***
         * what:請求的標識
         * request:請求
         * response:請求的回調監聽
         */

        /**請求可以併發,統一處理響應結果**/
        queue.add(0, request, new OnResponseListener<String>() {
            //請求一開始的回調,對話框的加載
            @Override
            public void onStart(int what) {

            }
            //成功之後的回調
            @Override
            public void onSucceed(int what, Response<String> response) {
                //設置響應結果
                mTv.setText(response.get());
            }
            //網絡請求失敗的回調
            @Override
            public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {

            }
            //網絡請求完成
            @Override
            public void onFinish(int what) {

            }
        });

    }

    public void btn_post(View view){
        RequestQueue queue = NoHttp.newRequestQueue();

        Request<String> request = NoHttp.createStringRequest(postUrl, RequestMethod.POST);

        request.addHeader("X-Bmob-REST-API-Key","2bfebfad889df974a01ab7867d411f75");
        request.addHeader("X-Bmob-Application-Id","cae7c5400719de3e04d708f5c82d94e8");
        request.addHeader("Content-Type","application/json");

        request.setDefineRequestBodyForJson("{\"username\" : \"1234567890\",\"password\" : \"654321\"}");

//        request.add("username","123456");
//        request.add("password","123456");
        queue.add(1, request, new OnResponseListener<String>() {
            @Override
            public void onStart(int what) {

            }

            @Override
            public void onSucceed(int what, Response<String> response) {
                mTv.setText(response.get());
            }

            @Override
            public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {

            }

            @Override
            public void onFinish(int what) {

            }
        });


    }

}

基本使用:

特別注意:這裏的RequestQueue是請求隊列,默認3個併發請求,也就是有3個子線程在跑,所以正式項目中不要每發起一個請求就new一個隊列,建議在BaseActivity#onCreate(Bundle)中new一個隊列即可,這個activity的所有請求包括依賴此activityfragment都是用這個隊列即可,在BaseActivity#onDestory()stop這個隊列即可,當然特殊情況下可以再new一個Queue出來,也無傷大雅的。

建議讀者閱讀完下方的代碼後再把上面這句話讀一遍,會理解的更深刻。

BaseActivity,提供基礎的封裝

public class BaseActivtiy extends Activity implements View.OnClickListener {

    /**
     * 請求隊列
     */
    private RequestQueue mRequestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 創建請求隊列, 默認併發3個請求, 傳入數字改變併發數量: NoHttp.newRequestQueue(5);
        mRequestQueue = NoHttp.newRequestQueue();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        mRequestQueue.cancelAll(); // 退出頁面時時取消所有請求。
        mRequestQueue.stop(); // 退出時銷燬隊列,回收資源。
    }


    /**
     * 發起一個請求。
     *
     * @param what     what.
     * @param request  請求對象。
     * @param listener 結果監聽。
     * @param <T>      要請求到的數據類型。
     */
    public <T> void request(int what, Request<T> request, OnResponseListener<T> listener) {
        mRequestQueue.add(what, request, listener);
    }
}

在BaseActivity的子類中使用

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
    }

    /**
     * 請求用戶信息。
     */
    private void requestUserInfo() {
        Request<String> req = NoHttp.createStringRequest(url);
        request(0, req, new OnResponseListener<String>() {
            @Override
            public void onStart(int what) {
                // 請求開始,可以顯示一個dialog。
            }

            @Override
            public void onSucceed(int what, Response<String> response) {
                // 請求成功,這裏判斷服務器的響應碼,假如你們服務器200時,纔是業務成功:
                Headers headers = response.getHeaders();
                if(headers.getResponseCode() == 200) {
                    String result = response.get(); // 拿到結果。
                }
            }

            @Override
            public void onFailed(int what, Response<String> response) {
                // 請求失敗,具體失敗類型,請看nohttp主頁的demo。
            }

            @Override
            public void onFinish(int what) {
                // 請求結束,關閉dialog。
            }
        });
    }
}

在BaseActivity的子類的Fragment中使用

public class MainFragment extends Fragment {

    /**
     * 請求用戶信息。
     */
    private void requestUserInfo() {
        Request<String> req = NoHttp.createStringRequest(url);
        ((MainActivity)getActivity()).request(0, req, new OnResponseListener<String>() {
            @Override
            public void onStart(int what) {
                // 請求開始,可以顯示一個dialog。
            }

            @Override
            public void onSucceed(int what, Response<String> response) {
                // 請求成功,這裏判斷服務器的響應碼,假如你們服務器200時,纔是業務成功:
                Headers headers = response.getHeaders();
                if(headers.getResponseCode() == 200) {
                    String result = response.get(); // 拿到結果。
                    }
            }

            @Override
            public void onFailed(int what, Response<String> response) {
                // 請求失敗,具體失敗類型,請看nohttp主頁的demo。
            }

            @Override
            public void onFinish(int what) {
                // 請求結束,關閉dialog。
            }
        });
    }

}

下一篇,nohttp的封裝版。

如果想學習更多的使用方法,建議參考Demo:https://github.com/yanzhenjie/NoHttp
更多使用介紹請閱讀NoHttp文檔:doc.nohttp.net

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章