您好,登錄后才能下訂單哦!
HTTP是現(xiàn)代應用程序訪問網(wǎng)絡的一種方式。網(wǎng)絡中很多請求就是使用的http方式,來訪問網(wǎng)絡的。
Android從4.4開始,HttpUrlConnection開始使用okhttp作為底層實現(xiàn)。實現(xiàn)原理如下圖:
這篇博客簡單說一下okhttp的使用。文字部分沒有講清楚的,可以查看代碼里面的注釋。首先看一下okHttp怎么工作的。
首先我們看看一個okhttp完整的網(wǎng)絡訪問,都涉及到了那幾個類(這里先說核心類)。
1.OkHttpClient: Call類的工廠,Call是用來發(fā)送網(wǎng)絡請求和接收服務器響應的類。這個類實例可以設置攔截器,緩存大小,緩存目錄,連接池等信息。
2.Request:是用來創(chuàng)建http請求,這個請求里面可以設置請求頭信息,網(wǎng)絡訪問地址,請求方式(GET,POST,DELETE,PUT)等。
3.Call:一個接口,一個準備執(zhí)行的請求。
具體代碼:
/** * 首先構建OkHttpClient,<br /> * 1. 方法:直接使用new 關鍵字創(chuàng)建 * 2. 方法:使用構造著模式,OkHttpClient.Builder.build方法構造。 * 這個類是用來配置和創(chuàng)建HTTP 連接。在大多數(shù)的程序中,這個類可以封裝成一個單利模式 * 來進行程序網(wǎng)絡訪問的統(tǒng)一管理。 * 設置 共享的響應緩存、線程池、連接復用 * (要設置這些東西,請使用官方提供的方法,OkHttpClient.Builder來設置緩存目錄、緩存大小, * 配置連接池, * 配置攔截器, * ) *然后構建Request請求對象<br /> * request對象只能使用Request.Builder.build來創(chuàng)建對象。 * 最后Call,使用httpClient.newCall(request)來生成一個執(zhí)行對象。 * 用call對象,調(diào)用execute方法,執(zhí)行網(wǎng)絡請求 * */ File file = new File(Environment.getDataDirectory().getAbsolutePath()+File.pathSeparator+"http_cache"); final Cache cache = new Cache(file, 20000); //最大的閑置連接數(shù)量, ConnectionPool pool = new ConnectionPool(10, 5, TimeUnit.SECONDS); //call的工廠類,Call是用來發(fā)送請求和接收響應的類 OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { //請求時的參數(shù) Response response = chain.proceed(chain.request()); okhttp3.MediaType mediaType = response.body().contentType(); // 響應體 String content = response.body().string(); return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build(); } // 這只連接池,緩存 }).connectionPool(pool).cache(cache).build(); //這里面來設置網(wǎng)絡訪問的頭信息,以及訪問的網(wǎng)絡地址,這里默認使用get方式請求 Request request = new Request.Builder().url("https://www.baidu.com").build(); Call call = httpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d("--MainActivity--", "onFailure: ---網(wǎng)絡訪問失敗"); } @Override public void onResponse(Call call, Response response) throws IOException { // 這個方法在網(wǎng)絡訪問成功之后回執(zhí)行。response響應體,實例里封裝了服務器返回的數(shù)據(jù)。 // 最常用的就是body(),服務器返回的數(shù)據(jù)(ResponseBody)。這個ResponseBody里面是服務器具體返回的數(shù)據(jù) // 如果是返回的字符串則用string()方法。如果是流, 則byteStream(),字節(jié)數(shù)組bytes(). Log.d("--MainActivity--", "onResponse: "+response.body().string()); } });
這樣一個完整的網(wǎng)絡訪問就完成了。
使用到得權限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注:okhttp源碼:https://github.com/square/okhttp
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。