volley+okhttp封裝,一行代碼就可訪問網絡
前言:
我寫這個可能不會完全的教會你去怎么封裝一個網絡框架,我的目的在於讓你不需要你自己封裝就可以訪問網絡,或者說互相學習也可以,我只是想讓你大概的了解下我的思路,最主要的就是教你如何使用它,並且將它應用在自己的項目中。因為現在的volley很火,而且okhttp也很火,這二者結合非常適合網絡請求,具體有什么好處,大家可以自行百度,這里就不啰嗦了。
簡介
支持post,get請求,上傳單個文件,上傳多個文件,表單提交
如何一行代碼就可以訪問網絡
1,訪問網絡帶參數post請求
String url = "http://dev.bodyplus.cc:8088/api/users?do=smsCode"; //參數 Map<String, String> params = new HashMap<>(); params.put("smsType", "1"); params.put("smsPhone", "18219200511"); params.put("type", "2"); //最主要的就是這一行 NetworkUtils.getInstance().sendPostRequest(url, params, new RequestCallback() { @Override public void onSuccess(Object object) { Log.d("1008611", object.toString()); data.setText(object.toString()); } @Override public void onFail(String string) { Log.d("1008611", string); data.setText(string); }
這需要調用上面這個方法就可以訪問網絡了,是不是很簡單
2,上傳一個帶參數的文件
//上傳地址 String url = ""; //參數 Map<String, String> params = new HashMap<>(); params.put("key", "value"); String path = ""; //需要上傳的文件 File file = new File(path); NetworkUtils.getInstance().uploadFile(url, params, "file", file, new RequestCallback() { @Override public void onSuccess(Object object) { } @Override public void onFail(String string) { } });
封裝大致思路
從上面的方法可以看出,入口是NetworkUtils這個類,這個類里的方法
/** * 支持post 帶參數的請求 * * @param url 訪問的地址 * @param params 訪問需要加的參數 * @param callback 訪問的回調 */ public void sendPostRequest(String url, Map<String, String> params, final RequestCallback callback) { if (UiUtils.hasNetwork()) { CustomRequest customRequest = new RequestBuilder().url(url).params(params).post().succesListener(new Response.Listener() { @Override public void onResponse(Object response) { try { JSONObject jsonObject = new JSONObject(response.toString()); String msg = getMsg(jsonObject); if (validationStatusCode(jsonObject)) { callback.onSuccess(response); } else { callback.onFail(msg); } } catch (JSONException e) { e.printStackTrace(); callback.onFail("服務器異常"); } } }).errorListener(new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (!TextUtils.isEmpty(error.getMessage())) { callback.onFail(error.getMessage()); } else { callback.onFail("服務器異常"); } } }).build(); HttpClientRequest.getInstance().addRequest(customRequest); } else { callback.onFail("網絡掉線了!"); } }
HttpClientRequest.getInstance().addRequest(customRequest);這行代碼執行后就可以訪問網絡了,是的,里面的參數是一個request,這個request是自定義的,CustomRequest類里可以添加http的頭,在這里可以添加cookie,或者存儲cookie,具體可以下載Demo查看,還有一個類就是HttpClientRequest,這個類的方法:
public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(UiUtils.getContext(), new OkHttpStack()); } return mRequestQueue; }
當然不是這一個方法,還有其他的方法,在這個方法里使用了OkHttpStack,
因為最終我要使用的是OkHttpClient,所以在這個類里,使用了OkHttpClient,可以在Demo查看。
如何使用
至於實現的思路,可能這樣不會講的很清楚,但是咱們都是看代碼都能懂得人就不用講的太多了,最主要的還是如何使用啦
很簡單,按照我說的做,你就可以使用啦,
netutils的包下就是這個訪問網絡的所有類,所以直接復制到你的項目里
還有一個就是libs下有兩個jar包,也復制到你的項目里
另外一個就是gradle文件
dependencies {
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
compile 'com.squareup.okhttp3:okhttp:3.4.0-RC1'
compile 'com.google.code.gson:gson:2.7'
compile files('libs/org.apache.http.legacy.jar')
compile files('libs/httpmime-4.2.5.jar')
}
做完了這些,就算移植成功了
最后的話
不能光會使用,還得了解下他的原理,不在這介紹原理了就,網上有很多人講的都很明白,也可以看看源碼,這個封裝就是仿照源碼完成的。
Demo地址: https://github.com/FussenYu/HttpDemo