Retrofit2 用例
public interface GitHubService {
@GET("users/{user}/repos")
Call> listRepos(@Path("user") String user);
}
public interface IBannerService {
@FormUrlEncoded
@POST("/") // 必须要有"/"
public Call getBanner(@Field("data") String json);
}
public interface ILoginService {
@FormUrlEncoded
@POST("/")
public Call getBanner(@Field
("data") String json);
}
为什么这么写?我们项目接口形式是http://www.baidu.com?data=json的形式,post提交
.....
登陆,获取banner.... 我还有注册,评论,关注,点赞,列表
在让我写多少这样的代码,老铁啊....整个通用的,自己项目用就好,别整没用的~
package api;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface IApi {
public final String KEY = "data";
@FormUrlEncoded
@POST("/")
public Call doPost(@Field(KEY) String json);
}
public class RetrofitHelper002 {
/** 基本路径 */
public static final String BASE_URL = "https://api.imeizan.cn";
public static void exec(String json) {
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(IGsonFactory.create(gson)).build();
IApi service = retrofit.create(IApi.class);
Call call = service.doPost(json);
call.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, Throwable arg1) {
System.out.println("异步失败");
}
@Override
public void onResponse(Call arg0,
Response arg1) {
System.out.println("异步返回");
}
});
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BannerReq req = new BannerReq(1);
Gson gson = new Gson();
String json = gson.toJson(req);
System.out.println(json);
// RetrofitHelper.tst(json);
// RetrofitHelper002.tst(json);
RetrofitHelper002.exec(json);
}
}
Caused by: java.lang.IllegalArgumentException: Method return type must not include a type variable or wildcard: retrofit2.Call
for method IApi.doPost
换成这样
public interface Api {
public final String KEY = "data";
@FormUrlEncoded
@POST("/")
public Call doPost(@Field(KEY) String json);
}
public class RetrofitHelper002 {
/** 基本路径 */
public static final String BASE_URL = "https://api.imeizan.cn";
public static void exec(String json) {
Gson gson = new GsonBuilder().setLenient().create(); // 不用这个创建gson,报异常
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create(gson)).build();
Api service = retrofit.create(Api.class);
json = AesEncryptionUtil.encrypt(json);
Call call = service.doPost(json);
call.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, Throwable arg1) {
System.out.println("异步失败");
}
@Override
public void onResponse(Call arg0, Response resp) {
System.out.println("异步返回" + resp.body());
}
});
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BannerReq req = new BannerReq(1);
Gson gson = new Gson();
String json = gson.toJson(req);
System.out.println(json);
// RetrofitHelper.tst(json);
// RetrofitHelper002.tst(json);
RetrofitHelper002.exec(json);
}
}
运行后的结果,拦截器拦截log日志,发现数据没有问题,但是成功回调时,发现数据断了一部分,这条路走不通了,只能自定义GsonConverterFactory
自定义GsoncovertFactory如下
package factory;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
public class IGsonFactory extends Converter.Factory {
public static IGsonFactory create() {
return create(new GsonBuilder().setLenient().create());
}
public static IGsonFactory create(Gson gson) {
if (gson == null)
throw new NullPointerException("gson == null");
return new IGsonFactory(gson);
}
private final Gson gson;
private IGsonFactory(Gson gson) {
this.gson = gson;
}
@Override
public Converter responseBodyConverter(Type type,
Annotation[] annotations, Retrofit retrofit) {
TypeAdapter adapter = gson.getAdapter(TypeToken.get(type));
return new IResponseBodyConverter<>(gson, adapter); // 响应
}
@Override
public Converter requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations,
Retrofit retrofit) {
System.out.println("#发起请求#");
TypeAdapter adapter = gson.getAdapter(TypeToken.get(type));
return new IRequestBodyConverter<>(gson, adapter); // 请求
}
}
package factory;
import java.io.IOException;
import java.nio.charset.Charset;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.wyhd.encry.decry.security.util.AesEncryptionUtil;
/**
* RequestBody 对请求体进行加密处理
*/
public class IRequestBodyConverter implements Converter {
private static final MediaType MEDIA_TYPE = MediaType
.parse("application/json; charset=UTF-8");
static final Charset UTF_8 = Charset.forName("UTF-8");
final Gson gson;
final TypeAdapter adapter;
IRequestBodyConverter(Gson gson, TypeAdapter adapter) {
this.gson = gson;
this.adapter = adapter;
System.out.println("#IRequestBodyConverter初始化#");
}
@Override
public RequestBody convert(T value) throws IOException {
String json = value.toString();
System.out.println("#加密前#" + json);
json = AesEncryptionUtil.encrypt(json);
System.out.println("#加密后#" + json);
return RequestBody.create(MEDIA_TYPE, json);
}
}
package factory;
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.wyhd.encry.decry.security.util.AesEncryptionUtil;
public class IResponseBodyConverter implements Converter {
private final Gson gson;
private final TypeAdapter adapter;
IResponseBodyConverter(Gson gson, TypeAdapter adapter) {
this.gson = gson;
this.adapter = adapter;
}
@Override
public T convert(ResponseBody value) throws IOException {
String string = value.string();
System.out.println("#解密前@#" + string);
string = AesEncryptionUtil.decrypt(string);
System.out.println("#解密后@#" + string);
return adapter.fromJson(string);
}
}
public class RetrofitHelper002 {
/** 基本路径 */
public static final String BASE_URL = "https://api.imeizan.cn";
public static void exec(String json) {
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(IGsonFactory.create(gson)).build();
Api service = retrofit.create(Api.class);
json = AesEncryptionUtil.encrypt(json);
Call call = service.doPost(json);
call.enqueue(new Callback() {
@Override
public void onFailure(Call request, Throwable arg1) {
System.out.println("异步失败"+request.toString());
}
@Override
public void onResponse(Call arg0, Response resp) {
System.out.println("异步返回" + resp.body());
}
});
}
}
还得改造
package factory;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
public class IGsonFactory2 extends Converter.Factory {
public static IGsonFactory2 create() {
return create(new GsonBuilder().setLenient().create());
}
public static IGsonFactory2 create(Gson gson) {
if (gson == null)
throw new NullPointerException("gson == null");
return new IGsonFactory2(gson);
}
private final Gson gson;
private IGsonFactory2(Gson gson) {
this.gson = gson;
}
@Override
public Converter responseBodyConverter(Type type,
Annotation[] annotations, Retrofit retrofit) {
return new IResponseBodyConverter2(); // 响应
}
@Override
public Converter requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations,
Retrofit retrofit) {
System.out.println("#发起请求#");
TypeAdapter adapter = gson.getAdapter(TypeToken.get(type));
return new IRequestBodyConverter2<>(gson, adapter); // 请求
}
}
package factory;
import java.io.IOException;
import java.nio.charset.Charset;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.wyhd.encry.decry.security.util.AesEncryptionUtil;
/**
* RequestBody 对请求体进行加密处理
*/
public class IRequestBodyConverter2 implements Converter {
private static final MediaType MEDIA_TYPE = MediaType
.parse("application/json; charset=UTF-8");
static final Charset UTF_8 = Charset.forName("UTF-8");
final Gson gson;
final TypeAdapter adapter;
IRequestBodyConverter2(Gson gson, TypeAdapter adapter) {
this.gson = gson;
this.adapter = adapter;
System.out.println("#IRequestBodyConverter初始化#");
}
@Override
public RequestBody convert(T value) throws IOException {
String json = value.toString();
System.out.println("#加密前#" + json);
json = AesEncryptionUtil.encrypt(json);
System.out.println("#加密后#" + json);
return RequestBody.create(MEDIA_TYPE, json);
}
}
package factory;
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import com.wyhd.encry.decry.security.util.AesEncryptionUtil;
public class IResponseBodyConverter2 implements Converter {
@Override
public String convert(ResponseBody value) throws IOException {
String string = value.string();
System.out.println("#解密前@#" + string);
string = AesEncryptionUtil.decrypt(string);
System.out.println("#解密后@#" + string);
return string;
}
}
public class RetrofitHelper002 {
/** 基本路径 */
public static final String BASE_URL = "https://api.imeizan.cn";
public static void exec(String json) {
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(IGsonFactory2.create(gson)).build();
Api service = retrofit.create(Api.class);
json = AesEncryptionUtil.encrypt(json);
Call call = service.doPost(json);
call.enqueue(new Callback() {
@Override
public void onFailure(Call request, Throwable arg1) {
System.out.println("异步失败"+request.toString());
}
@Override
public void onResponse(Call arg0, Response resp) {
System.out.println("异步返回" + resp.body());
}
});
}
}
回调函数
package callback;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import com.google.gson.internal.$Gson$Types;
import retrofit2.Call;
public abstract class ResultCallback {
public Type mType;
public ResultCallback() {
mType = getSuperclassTypeParameter(getClass());
}
static Type getSuperclassTypeParameter(Class subclass) {
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types
.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public abstract void onError(Call request, Throwable e);
public abstract void onResponse(T response);
}
package http;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import api.Api;
import callback.ResultCallback;
import com.google.gson.Gson;
import com.wyhd.common.sdk.Logger;
import com.wyhd.common.sdk.util.Tools;
import com.wyhd.encry.decry.security.util.AesEncryptionUtil;
import factory.HttpLoggingInterceptor;
import factory.IGsonFactory2;
public class HttpManager {
public static final String BASE_URL = "https://api.imeizan.cn";
public static final Gson GSON = new Gson();
public static final String TAG = HttpManager.class.getSimpleName();
private OkHttpClient mOkHttpClient;
private Retrofit mRetrofit;
private HttpManager() {
mOkHttpClient = getOkHttpClient();
mRetrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(mOkHttpClient)/*
* .addConverterFactory(GsonConverterFactory.
* create(new
* GsonBuilder().setLenient().create()))
*/
.addConverterFactory(IGsonFactory2.create())/**/.build();
}
private static final class HttpManagerHolder {
private static final HttpManager INSTANCE = new HttpManager();
}
public static HttpManager getInstance() {
return HttpManagerHolder.INSTANCE;
}
public static void doPost(Object src, final ResultCallback mCallback) {
getInstance().exec(src, mCallback);
}
public static String reqParams(Object src) {
String json = "";
if (src != null && src instanceof String) {
json = (String) src;
} else {
if (src == null) {
} else {
json = GSON.toJson(src);
}
}
return json;
}
public void exec(Object src, final ResultCallback mCallback) {
String json = reqParams(src);
System.out.println("#加密前#" + json);
json = AesEncryptionUtil.encrypt(json);
System.out.println("#加密后#" + json);
Api api = mRetrofit.create(Api.class);
Call doPost = api.doPost(json);
doPost.enqueue(new Callback() {
@Override
public void onFailure(Call request, Throwable error) {
System.out.println("#失败回调#" + request.toString());
if (mCallback != null) {
mCallback.onError(null, error);
}
}
@Override
public void onResponse(Call call, Response resp) {
System.out.println("#成功回调#");
if (mCallback != null) {
if (resp.isSuccessful()) {
String finalStr = "";
String string = resp.body();
System.out.println(string.length());
Logger.e("++++++++++++++++onResponse++++++++++++++++++");
Logger.e(string);
Logger.e("++++++++++++++++onResponse++++++++++++++++++");
System.out.println("##" + resp.toString());
System.out.println("##" + resp.message());
System.out.println("#解密前#" + string);
// finalStr = AesEncryptionUtil.decrypt(string);
finalStr = string;
System.out.println("#解密后#" + finalStr);
if (mCallback.mType != null) {
if (mCallback.mType == String.class) {
if (Tools.isEmpty(finalStr)) {
Exception e = new Exception(
"AesEncryptionUtil.decrypt(string) return null!");
exeFailedCallback(call, e, mCallback);
} else {
exeSuccessCallback(finalStr, mCallback);
}
} else {
Object o = GSON.fromJson(finalStr,
mCallback.mType);
System.out.println("#类型是#" + mCallback.mType);
if (o == null) {
Exception e = new Exception(
"mGson.fromJson(finalStr,callback.mType) return null!");
exeFailedCallback(call, e, mCallback);
} else {
exeSuccessCallback(o, mCallback);
}
}
} else {
Throwable e = new Throwable("mCallback.mType 为空!!!");
exeFailedCallback(call, e, mCallback);
}
} else {
Throwable e = new Throwable(resp.toString());
exeFailedCallback(call, e, mCallback);
}
}
}
});
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void exeFailedCallback(final Call call, final Throwable e,
final ResultCallback callback) {
if (callback != null) {
callback.onError(call, e);
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void exeSuccessCallback(Object o, final ResultCallback callback) {
if (callback != null) {
callback.onResponse(o);
}
}
public static OkHttpClient getOkHttpClient() {
// 日志显示级别
HttpLoggingInterceptor.Level level = HttpLoggingInterceptor.Level.BODY;
// 新建log拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(
new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
System.out.println(message);
}
});
loggingInterceptor.setLevel(level);
// 定制OkHttp
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
// OkHttp进行添加拦截器loggingInterceptor
httpClientBuilder.addInterceptor(loggingInterceptor);
return httpClientBuilder.build();
}
}
public class HttpRequestFactory {
public static void exec(Object src, final ResultCallback mCallback) {
HttpManager.doPost(src, mCallback);
}
}
package com.july.testunit;
import http.HttpRequestFactory;
import http.RetrofitHelper002;
import retrofit2.Call;
import android.app.Activity;
import android.os.Bundle;
import bean.BannerReq;
import bean.BannerResp;
import callback.ResultCallback;
import com.google.gson.Gson;
import com.july.retrfit.R;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BannerReq req = new BannerReq(1); // banner请求
HttpRequestFactory.exec(req, new ResultCallback() {
@Override
public void onError(Call request, Throwable e) {
System.out.println("##失败##" + e.getMessage());
}
@Override
public void onResponse(BannerResp response) {
System.out.println("##成功##" + response);
}
});
LoginReq req2 = new LoginReq(2); // 登陆请求
HttpRequestFactory.exec(req2, new ResultCallback() {
@Override
public void onError(Call request, Throwable e) {
System.out.println("##失败##" + e.getMessage());
}
@Override
public void onResponse(LoginResp response) {
System.out.println("##成功##" + response);
}
});
}
}
到此为止,封装前进了一小步!!!