參考博客: 點擊打開鏈接
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作爲網絡層:
compile 'com.yolanda.nohttp:nohttp:1.1.0'
如果要使用OkHttp作爲網絡層,請再依賴:compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'
初始化
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