所有代码亲测可用,如有问题,欢迎指正。
首先在ApiService接口文件中新建文件上传接口
public interface ApiService { static final String BASE_URL=" http://192.168.3.102:8080/"; /** * 上传多头像 */ @Multipart @POST("wzly/uploadImg") Observable<String> uploadMemberIcon(@Part List<MultipartBody.Part> partList); }
我使用ServiceFactory.java封装了Retrofit2和OkHttp
package com.wzly.iscan.tools.api; import android.util.Log; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.io.IOException; import java.lang.reflect.Field; import java.util.Locale; import java.util.concurrent.TimeUnit; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by admin on 2016/11/15. * 单例模式:每次实例化出来的都是统一个实例。 */ public class ServiceFactory { private final Gson mGsonDateFormat; public ServiceFactory() { mGsonDateFormat = new GsonBuilder() .setDateFormat("yyyy-MM-dd hh:mm:ss") .create(); } private static class SingletonHolder { private static final ServiceFactory INSTANCE = new ServiceFactory(); } public static ServiceFactory getInstance() { return SingletonHolder.INSTANCE; } /** * create a service * * @param serviceClass * @param <S> * @return */ public <S> S createService(Class<S> serviceClass) { String baseUrl = ""; try { Field field1 = serviceClass.getField("BASE_URL"); baseUrl = (String) field1.get(serviceClass); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.getMessage(); e.printStackTrace(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(getOkHttpClient()) .addConverterFactory(GsonConverterFactory.create(mGsonDateFormat)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return retrofit.create(serviceClass); } private final static long DEFAULT_TIMEOUT = 10; private OkHttpClient getOkHttpClient() { //定制OkHttp OkHttpClient.Builder httpClientBuilder = new OkHttpClient .Builder(); //设置超时时间 httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); httpClientBuilder.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); httpClientBuilder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); httpClientBuilder.addInterceptor(new RequestInterceptor()); httpClientBuilder.addInterceptor(new LogInterceptor()); return httpClientBuilder.build(); } /** * 日志拦截器 */ private class LogInterceptor implements Interceptor { @Override public okhttp3.Response intercept(Chain chain) throws IOException { long t1 = System.nanoTime(); okhttp3.Response response = chain.proceed(chain.request()); long t2 = System.nanoTime(); Log.v("zcb", String.format(Locale.getDefault(), "Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); okhttp3.MediaType mediaType1 = response.body().contentType(); String content = response.body().string(); Log.i("zcb", "response body:" + content); return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType1, content)) .build(); } } /** * 请求拦截器,修改请求header */ private class RequestInterceptor implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request() .newBuilder() .build(); Log.v("zcb", "request:" + request.toString()); Log.v("zcb", "request headers:" + request.headers().toString()); return chain.proceed(request); } } }