OkHttp3詳解
OkHttp3 官網 & website
1.Http協議簡介
客戶端向服務器發送一個Request,服務端收到Request并進行一系列的處理,返回給客戶端一個Response
Http狀態碼簡介(code為三位數)
1xx(臨時響應) 2xx (成功)3xx (重定向) 4xx(請求錯誤)5xx(服務器錯誤)
2.快速使用(AndroidStudio)
①添加依賴 compile ‘com.squareup.okhttp3:okhttp:3.8.1’
②添加網絡權限
③GET請求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: "+ e.getLocalizedMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e(TAG, "onResponse: "+result);
// 用完關閉資源
if (response.body()!=null){
response.body().close();
}
}
});
④Response里有這么兩個方法
// response.isSuccessful();是否連接成功 狀態碼2xx
// response.isRedirect();是否重定向 狀態碼3xx
⑤Post請求(form表單)
OkHttpClient client = new OkHttpClient();
// post請求需要傳入一個RequestBody對象
// 直接點進去RequestBody,通過查看源碼發現RequestBody是個抽象類
// RequestBody右鍵-->Go To-->Implementation(s)
// 發現有兩個具體實現類 FormBody(表單) MultiparBody(多種提交方式包括表單、文件等)
RequestBody body;
body = new FormBody.Builder().add("phone","12345678900").build();
Request request = new Request.Builder().url(postPath).post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
});
⑥Post(json形式)
OkHttpClient client = new OkHttpClient();
// json字符串 {"phone":"1234678900"}
String jsonParams = new Gson().toJson(new Phone("1234678900"));
RequestBody body = RequestBody.create(MediaType.parse("application/json"),jsonParams);
Request request = new Request.Builder().url(postPath).post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
}
});
⑦文件上傳(表單形式上傳文字和圖片)
OkHttpClient client = new OkHttpClient();
String basePath = Environment.getExternalStorageDirectory().getAbsolutePath();
RequestBody fileBody1 = RequestBody.create(MediaType.parse("image/png"),new File(basePath+"img1.png"));
RequestBody fileBody2 = RequestBody.create(MediaType.parse("image/png"),new File(basePath+"img2.png"));
// .addFormDataPart("idcard_front_img","1",fileBody1)
// 此處傳"1",可能會在后臺生成圖片名.1這種形式的文件
// 為了便于管理可以寫成addFormDataPart("idcard_front_img","png",fileBody1)
// 傳null可能會導致調用fail方法
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("idcard_no","130233199560509xxxx")
.addFormDataPart("idcard_front_img","1",fileBody1)
.addFormDataPart("idcard_behind_img","2",fileBody2)
.build();
Request request = new Request.Builder().url(imgPostPath).post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG,"上傳成功");
}
});
⑧文件下載
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(downLoadPath).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = null;
FileOutputStream fos = null;
is = response.body().byteStream();
fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"xxx.apk"));
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b))!=-1){
fos.write(b,0,len);
fos.flush();
}
is.close();
fos.close();
}
});
⑨源碼與效果 點我下載源碼
智能推薦
OkHttp3源碼分析
基本使用 從使用方法出發,首先是怎么使用,其次是我們使用的功能在內部是如何實現的.建議大家下載 OkHttp 源碼之后,跟著本文,過一遍源碼。 官方博客栗子:http://square.github.io/okhttp/#examples Request、Response、Call 基本概念 上面的代碼中涉及到幾個常用的類:Request、Response和Call。下面分別介紹: Request...
OKHttp3源碼解析
鑒于一些關于OKHttp3源碼的解析文檔過于碎片化,本文系統的,由淺入深得,按照網絡請求發起的流程順序來講解OkHttp3的源碼。在自己學習的同時,給大家分享一些經驗。 主要架構和流程 OKHttpClient、Call OKHttp3在項目中發起網絡請求的API如下: OKHttpClient類: OKHttpClient 里面組合了很多的類對象。其實是將OKHttp的很多功能模塊,全部包裝進這...
OkHttp3 框架學習
1.Okhttp介紹 android網絡框架Okhttp,是輕量級框架,由移動支付Square公司貢獻 優點: 允許連接到同一個主機地址的所有請求,提高請求效率 共享Socket,減少對服務器的請求次數 通過連接池,減少了請求延遲 緩存響應數據來減少重復的網絡請求 減少了對數據流量的消耗 自動處理GZip壓縮 功能: get,post請求 文件的上傳下載 加載圖片 支持請求回調,直接返回對象、對象...
OkHttp3源碼分析
本文已授權「玉剛說」微信公眾號獨家發布 前言 平常開發Android App的時候,經常用到OkHttp,不能只停留在會用的階段,還要知道其原理。今天就來分析一下OkHttp3的源碼。 基本用法 以post請求為例,基本用法如下: 可以看到大致分四步: 1、構建OkHttpClient對象; 2、構建Request請求對象; 3、構建Call對象; 4、發起請求; 下面一步一步分析 源碼分析 1、...
okhttp3 Cache回顧
先回顧一下HTTP的相關知識 HTTP response status codes 200 - 請求成功 301 - 資源(網頁等)被永久轉移到其它URL 404 - 請求的資源(網頁等)不存在 500 - 內部服務器錯誤 1** 信息,服務器收到請求,需要請求者繼續執行操作 2** 成功,操作被成功接收并處理 3** 重定向,需要進一步的操作以完成請求 4** 客戶端錯誤,請求包含語法錯誤或無法...
猜你喜歡
okhttp3 源碼分析
總體流程 下面的流程圖是由上面的文章抄來的(自己畫的圖,用的visio) 整個流程是,通過OkHttpClient將構建的Request轉換為Call,然后在RealCall中進行異步或同步任務,最后通過一些的攔截器interceptor發出網絡請求和得到返回的response。 將流程大概是這么個流程,大家可以有個大概的印象,繼續向下看: 為了讓大家有更深的印象,我準備追蹤一個GET網絡請求的具...
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...
FlycoTabLayout 的使用
FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...
爬蟲項目實戰八:爬取天氣情況
爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...
關于web項目的目錄問題
先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...