要在每个方法上注释@Headers("Content-Type: application/json"),太麻烦。用拦截器+反射,
public class RetrofitUtil {
public static OkHttpClient genericClient() {
OkHttpClient httpClient = new OkHttpClient();
httpClient.interceptors().add(chain -> {
Request request = chain.request();
MediaType mediaType = request.body().contentType();
try {
Field field = mediaType.getClass().getDeclaredField("mediaType");
field.setAccessible(true);
field.set(mediaType, "application/json");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return chain.proceed(request);
});
return httpClient;
}
}
调用的时候这么写:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Http.URL)
.addConverterFactory(GsonConverterFactory.create())
.client(RetrofitUtil.genericClient())
.build();
public static OkHttpClient genericClient() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.addHeader("Accept-Encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("Accept", "*/*")
.addHeader("Cookie", "add cookies here")
.build();
return chain.proceed(request);
}
})
.build();
return httpClient;
}