天天看點

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作為網絡層:

如果要使用OkHttp作為網絡層,請再依賴:

初始化

NoHttp初始化需要一個Context,最好在

Application

onCreate()

中初始化,記得在

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

的所有請求包括依賴此

activity

fragment

都是用這個隊列即可,在

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

上一篇: NoHttp