參考部落格: 點選打開連結
- NoHttp詳細文檔:http://doc.nohttp.net
- NoHttp公益測試接口:http://api.nohttp.net
- 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