首先我们要导入依赖
compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
简陋的封装一个请求工具类.
import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class HttpRequestClient { public static final String TAG = "HttpRequestClientTAG"; private static Retrofit retrofit; private static OkHttpClient getOkHttpClient() { /* //日志显示级别 HttpLoggingInterceptor.Level level= HttpLoggingInterceptor.Level.BODY; //新建log拦截器 HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.d(TAG, message); } }); loggingInterceptor.setLevel(level);*/ //定制OkHttp OkHttpClient.Builder httpClientBuilder = new OkHttpClient .Builder(); //OkHttp进行添加拦截器loggingInterceptor // httpClientBuilder.addInterceptor(loggingInterceptor); return httpClientBuilder.build(); } public static Retrofit getRetrofitHttpClient(){ if(null == retrofit){ synchronized (HttpRequestClient.class){ if(null == retrofit){ retrofit = new Retrofit.Builder() .client(getOkHttpClient()) .baseUrl("https://www.zhaoapi.cn/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } } } return retrofit; } }
定义一个接口来设置请求的参数和准备上传的文件
public interface GoodsReturnApiService {
//上传文件必须用这个注解
@Multipart
@POST("file/upload")
//这里是自己post文件的地址@part就是你准备上传的文件,写自己的bean
Observable<LoadBean> postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts);
}
在activity中调用这个方法就可上传头像
private void postGoodsPicToServer(){
Map<String,RequestBody> params = new HashMap<>();
//以下参数是,参数需要换成自己服务器支持的
params.put("uid", convertToRequestBody("1701"));
params.put("token",convertToRequestBody("E6C4C1B581A506F2F4D6748B3649AD3C"));
params.put("source",convertToRequestBody("android"));
params.put("appVersion",convertToRequestBody("101"));
//要添加的文件,这是一个集合,可以传一个,也可以传多个.
String path1 = Environment.getExternalStorageDirectory()+"/abc.png";
// String path2 = Environment.getExternalStorageDirectory() +"/abc.png";
imageView.setImageURI(Uri.parse(path1));
List<File> fileList = new ArrayList<>();
//将你文件的路径添加到集合内部.
fileList.add(new File(path1));
List<MultipartBody.Part> partList = filesToMultipartBodyParts(fileList);
HttpRequestClient.getRetrofitHttpClient().create(GoodsReturnApiService.class)
.postGoodsReturnPostEntitys(params,partList)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<LoadBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Toast.makeText(MainActivity.this,"onSubscribe",Toast.LENGTH_LONG).show();
}
@Override
public void onNext(@NonNull LoadBean goodsReturnPostEntity) {
Toast.makeText(MainActivity.this,"success",Toast.LENGTH_LONG).show();
}
@Override
public void onError(@NonNull Throwable e) {
Toast.makeText(MainActivity.this,"onError",Toast.LENGTH_LONG).show();
}
@Override
public void onComplete() {
Toast.makeText(MainActivity.this,"onComplete",Toast.LENGTH_LONG).show();
}
});
}
private RequestBody convertToRequestBody(String param){
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), param);
return requestBody;
}
private List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files) {
List<MultipartBody.Part> parts = new ArrayList<>(files.size());
for (File file : files) {
//设置文件的类型
RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
//file就是上传文件的参数类型,后面的file.getName()就是你上传的文件,首先要拿到文件的地址
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
parts.add(part);
}
return parts;
}