Retrofit2封装之路(请求参数加密解密)(二)

Retrofit2 用例
public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
public interface IBannerService {
	@FormUrlEncoded
	@POST("/") // 必须要有"/"
	public Call<BannerResp> getBanner(@Field("data") String json);
}
public interface ILoginService {
	@FormUrlEncoded
	@POST("/")
	public Call<LoginResp> 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<T> {
	public final String KEY = "data";

	@FormUrlEncoded
	@POST("/")
	public Call<T> doPost(@Field(KEY) String json);
}

然而,没有什么卵用,别问我为什么,一言不合报错

public class RetrofitHelper002 {
	/** 基本路径 */
	public static final String BASE_URL = "https://api.imeizan.cn";

	public static <T> 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<BannerResp> service = retrofit.create(IApi.class);
		Call<BannerResp> call = service.doPost(json);
		call.enqueue(new Callback<BannerResp>() {

			@Override
			public void onFailure(Call<BannerResp> arg0, Throwable arg1) {
				System.out.println("异步失败");
			}

			@Override
			public void onResponse(Call<BannerResp> arg0,
					Response<BannerResp> 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<T>
     for method IApi.doPost

 换成这样

public interface Api {
	public final String KEY = "data";

	@FormUrlEncoded
	@POST("/")
	public Call<String> doPost(@Field(KEY) String json);
}

运行代码

public class RetrofitHelper002 {
	/** 基本路径 */
	public static final String BASE_URL = "https://api.imeizan.cn";

	public static <T> 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<String> call = service.doPost(json);
		call.enqueue(new Callback<String>() {

			@Override
			public void onFailure(Call<String> arg0, Throwable arg1) {
				System.out.println("异步失败");
			}

			@Override
			public void onResponse(Call<String> arg0, Response<String> 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<ResponseBody, ?> responseBodyConverter(Type type,
			Annotation[] annotations, Retrofit retrofit) {
		TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
		return new IResponseBodyConverter<>(gson, adapter); // 响应
	}

	@Override
	public Converter<?, RequestBody> 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<T> implements Converter<T, RequestBody> {
	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<T> adapter;

	IRequestBodyConverter(Gson gson, TypeAdapter<T> 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<T> implements Converter<ResponseBody, T> {
	private final Gson gson;
	private final TypeAdapter<T> adapter;

	IResponseBodyConverter(Gson gson, TypeAdapter<T> 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 <T> 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<String> call = service.doPost(json);
		call.enqueue(new Callback<String>() {

			@Override
			public void onFailure(Call<String> request, Throwable arg1) {
				System.out.println("异步失败"+request.toString());
			}

			@Override
			public void onResponse(Call<String> arg0, Response<String> 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<ResponseBody, ?> responseBodyConverter(Type type,
			Annotation[] annotations, Retrofit retrofit) {
		return new IResponseBodyConverter2(); // 响应
	}

	@Override
	public Converter<?, RequestBody> 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<T> implements Converter<T, RequestBody> {
	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<T> adapter;

	IRequestBodyConverter2(Gson gson, TypeAdapter<T> 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<ResponseBody, String> {

	@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 <T> 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<String> call = service.doPost(json);
		call.enqueue(new Callback<String>() {

			@Override
			public void onFailure(Call<String> request, Throwable arg1) {
				System.out.println("异步失败"+request.toString());
			}

			@Override
			public void onResponse(Call<String> arg0, Response<String> resp) {
				System.out.println("异步返回" + resp.body());

			}

		});
	}
}

能拿到返回的json,下一步加个回调,用gson解析json,爽歪歪,最后封装如下

回调函数

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<T> {
	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<T> 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 <T> void exec(Object src, final ResultCallback<T> mCallback) {
		String json = reqParams(src);
		System.out.println("#加密前#" + json);
		json = AesEncryptionUtil.encrypt(json);
		System.out.println("#加密后#" + json);

		Api api = mRetrofit.create(Api.class);
		Call<String> doPost = api.doPost(json);
		doPost.enqueue(new Callback<String>() {

			@Override
			public void onFailure(Call<String> request, Throwable error) {
				System.out.println("#失败回调#" + request.toString());
				if (mCallback != null) {
					mCallback.onError(null, error);
				}
			}

			@Override
			public void onResponse(Call<String> call, Response<String> 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 <T> void exec(Object src, final ResultCallback<T> 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<BannerResp>() {

			@Override
			public void onError(Call<BannerResp> 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<LoginResp>() {

			@Override
			public void onError(Call<LoginResp> request, Throwable e) {
				System.out.println("##失败##" + e.getMessage());
			}

			@Override
			public void onResponse(LoginResp response) {
				System.out.println("##成功##" + response);
			}
		});
	}
}

运行结果


到此为止,封装前进了一小步!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值