前言
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装
基本使用可以参考我以前的文章https://blog.csdn.net/niulinbiao/article/details/120360385
步骤
1、开启网络访问权限
<uses-permission android:name="android.permission.INTERNET" />
2、导入依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
3、网络接口
package com.enjoy.networkdemo;
import java.io.File;
import io.reactivex.rxjava3.core.Flowable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
public interface UploadService {
/**
* 用于文件上传
* @param file
* @return
*/
@POST("post")
@Multipart
Call<ResponseBody> upload(@Part MultipartBody.Part file);
/**
* 文件下载
* @param url
* @return
*/
@Streaming //文件特别大的时候可以防止内存溢出
@GET
Call<ResponseBody> download(@Url String url);
/**
* RxJava方式进行文件下载
* @param url
* @return
*/
@Streaming //文件特别大的时候可以防止内存溢出
@GET
Flowable<ResponseBody> downloadRxJava(@Url String url);
}
4、上传测试
package com.enjoy.networkdemo;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import okhttp3.Cache;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.http.Multipart;
public class UploadFileUnitTest {
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
UploadService uploadService = retrofit.create(UploadService.class);
@Test
public void uploadFileTest() throws IOException {
File file1 = new File("D:\\test.txt");
MultipartBody.Part part = MultipartBody.Part.createFormData("file1",
"test.txt",RequestBody.create(file1,MediaType.parse("text/plain")));
Call<ResponseBody> call = uploadService.upload(part);
System.out.println(call.execute().body().string());
}
5、下载测试
package com.enjoy.networkdemo;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import okhttp3.Cache;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.http.Multipart;
public class UploadFileUnitTest {
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
UploadService uploadService = retrofit.create(UploadService.class);
@Test
public void downloadTest() throws IOException {
Response<ResponseBody> response = uploadService.download("https://pic.ku66.net/tutu/2021/allimg/210612/12132Q6-1-X42.jpg")
.execute();
InputStream inputStream = response.body().byteStream();
FileOutputStream fos = new FileOutputStream("D:\\aaa.jpg");
int len;
byte[] bytes = new byte[4096];
while ((len = inputStream.read(bytes)) != -1) {
fos.write(bytes,0,len);
}
fos.close();
inputStream.close();
}
}