網站首頁 編程語言 正文
Okhttp 處理了很多網絡疑難雜癥,比如從很多常用的連接問題中自動恢復。如果你服務器配置了多個IP地址,當一個IP地址連接失敗后Okhttp會自動嘗試下一個IP,從Android4.4版本后,系統內置了Okhttp,可見Okhttp功能的強大。
遠程依賴添加,okio作為Okhttp的IO組件,也是必須要引入的。
? ? api 'com.squareup.okhttp3:okhttp:3.12.13'
? ? api 'com.squareup.okio:okio:2.8.0'
1.異步GET請求
Request.Builder url = new Request.Builder().url("");
url.method("GET", null);
Request build = url.build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
}
});
其基本步驟就是創建OkhttpClient、Request、和Call,最后調用Call的enqueue方法,需要注意的是onResponse回調并非在UI線程中,如果想要同步GET請求,則可以調用Call的execute方法。
2.異步POST請求
Okhttp3的異步POST請求和okhttp2的異步POST請求有一些差別,就是沒有FormEncodingBuilder這個類,替代它的是功能強大的FormBody。
RequestBody formBody = new FormBody.Builder()
.add("ip", "59.108.54.37")
.build();
Request build = new Request.Builder()
.url("")
.post(formBody)
.build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
這與異步GET請求類似,只是多了FormBody來封裝請求參數,并傳遞給Request
3.異步上傳文件
上傳文件本身也是一個POST請求,首先定義上傳的文件類型。
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
在SD卡的根目錄創建一個文件 ,里面內容為OkHttp
String filePath = "";
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
return;
}
File file = new File(filePath, "test.txt");
Request build = new Request.Builder()
.url("")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(build).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
如果想要改為同步上傳文件,只要調用OkhttpClient.newCall(request).execute()就可以了,最終請求返回結構就是我們txt文件中的內容。
4.異步下載文件
下載一張圖片,得到Respouse后流寫進我們指定的圖片文件中,代碼如下所示
String url = "";
Request request = new Request.Builder().url(url).build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
String filePath = "";
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
filePath = getFilesDir().getAbsolutePath();
}
File file = new File(filePath, "test.jpg");
if (null != file) {
fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[2048];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
5.異步上傳Multipart文件
有時上傳文件時,同時還需要上傳其他類型的字段。 Okhttp3 實現起來很簡單。 需要注意的是沒有服務器接受我這個Multipart文件,具體應用還要結合實際工作中對應的服務器
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
public static void send() {
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBody build = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "test") //1
.addFormDataPart("image", "test.jpg", RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))//2
.build();
Request authorization = new Request.Builder()
.header("Authorization", "Client-ID" + "...")
.url("")
.post(build)
.build();
okHttpClient.newCall(authorization).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
上述代碼中,注釋1處是常見的 key-value(鍵-值)形式的參數。
注釋2處則是上傳表單,addFormDataPart方法的第一個參數是key值,第二個參數是上傳文件的名字,第三個參數是需要上傳的文件。
6.設置超時時間和緩存
和Okhttp2有區別的是Okhttp3不能通過OkhttpClient直接設置超時時間和緩存了,而是通過OkHttpClient.Builder來設置。通過OkHttpClient.Builder配置好OkHttpClient后用builder.build()返回OkHttpClient。我們通常不會調用 new OkhttpClient() 來得到OkhttpClient,而是通過builder.build()得到OkHttpClient。另外OkHttp3支持設置連接,寫入和讀取超時時間。
File sdcache = new File("");
int cacheSize = 10 * 1024 * 1024;
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.cache(new Cache(sdcache.getAbsoluteFile(),cacheSize));
OkHttpClient okHttpClient = builder.build();
原文鏈接:https://blog.csdn.net/m0_63970488/article/details/125938410
相關推薦
- 2022-06-25 Android開發實現在TextView前面加標簽示例_Android
- 2022-08-10 Go?modules?replace解決Go依賴引用問題_Golang
- 2022-08-04 Python+NumPy繪制常見曲線的方法詳解_python
- 2023-05-26 解讀tf.keras.layers模塊中的函數_python
- 2023-02-23 Python創建7種不同的文件格式的方法總結_python
- 2021-12-18 通俗易通講解Android藍牙鍵值適配_Android
- 2023-02-18 Nginx中Location配置超詳細講解_nginx
- 2022-09-03 Python標準庫sys庫常用功能詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支