【框架】网络请求+Gson解析--Retrofit 2
其实内部是封装了Okhttp和Gson解析
public class CourseFragmentAPI {
public static void get(String userId, BaseCallBack<CourseFragmentResponseEntity> callBack){
CourseFragmentService service = BaseRetrofit.getInstance().create(CourseFragmentService.class);
Call<CourseFragmentResponseEntity> call = service.getData(userId);
call.enqueue(callBack);
}
}
public interface CourseFragmentService {
@GET("courses/my_order_list")
Call<CourseFragmentResponseEntity> getData(@Query("userId") String userId);
}
public class BaseRetrofit {
private Retrofit retrofit;
private static BaseRetrofit instance;
private BaseRetrofit() {
retrofit = new Retrofit.Builder().client(BaseOkHttpClient.getInstance()).baseUrl(Config.SERVER_URL).addConverterFactory(GsonConverterFactory.create()).build();
}
public static BaseRetrofit getInstance() {
if (instance == null) {
synchronized (BaseRetrofit.class) {
if (instance == null) {
instance = new BaseRetrofit();
}
}
}
return instance;
}
public <T> T create(Class<T> service) {
return retrofit.create(service);
}
}
public class BaseOkHttpClient {
public static OkHttpClient getInstance() {
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
HttpUrl originalHttpUrl = originalRequest.url();
HttpUrl.Builder builder = originalHttpUrl.newBuilder();
EncodeParas(originalHttpUrl, builder);
addCommonParas(builder);
HttpUrl url = builder.build();
Request.Builder requestBuilder = originalRequest.newBuilder()
.url(url)
.method(originalRequest.method(), originalRequest.body());
Request request = requestBuilder.build();
LogHelp.d("lyg", "request: " + request.method() + " " + request.url());
Response response = chain.proceed(request);
MediaType contentType = null;
String bodyString = null;
if (response.body() != null) {
contentType = response.body().contentType();
bodyString = response.body().string();
}
LogHelp.d("lyg", "response: " + response.code() + "\n" + bodyString);
if (response.body() != null) {// 深坑!打印body后原ResponseBody会被清空,需要重新设置body
ResponseBody body = ResponseBody.create(contentType, bodyString);
return response.newBuilder().body(body).build();
} else {
return response;
}
}
});
return httpClientBuilder.build();
}
/**
* 加密请求参数。debug模式不加密
*
* @param originalHttpUrl
*/
private static void EncodeParas(HttpUrl originalHttpUrl, HttpUrl.Builder builder) {
if (Config.isEncode) {
String paras = generateXXTEAEncodedParas(getOriginURLEncodedParas(originalHttpUrl), generateUserSignature());
String sign = generateAPPSignature(paras);
clearAllParas(originalHttpUrl, builder);
if (!TextUtils.isEmpty(paras)) {
builder.addQueryParameter("paras", paras);
}
if (!TextUtils.isEmpty(sign)) {
builder.addQueryParameter("sign", sign);
}
}
}
private static void addCommonParas(HttpUrl.Builder builder) {
builder.addQueryParameter("appId", Constant.APPId)
.addQueryParameter("ct", Constant.ClientType)
.addQueryParameter("v", Constant.APIVersion)
.addQueryParameter("ch", App.getAppChannel())
.addQueryParameter("cv", App.getAppVsersion());
LoginResponseEntity.Data data = UserData.getUser();
if (!Config.isEncode && null != data && !TextUtils.isEmpty(data.getXuehuToken()) && data.getUserId() > 0) {
builder.addQueryParameter("xuehuToken", data.getXuehuToken())
.addQueryParameter("userId", "" + data.getUserId());
}
}
private static void clearAllParas(HttpUrl originalHttpUrl, HttpUrl.Builder builder) {
Set<String> queryParameterNames = originalHttpUrl.queryParameterNames();
for (String name : queryParameterNames) {
builder.removeAllQueryParameters(name);
}
}
private static String getOriginURLEncodedParas(HttpUrl originalHttpUrl) {
StringBuilder builder = new StringBuilder();
Set<String> queryParameterNames = originalHttpUrl.queryParameterNames();
for (String name : queryParameterNames) {
if (!TextUtils.isEmpty(builder.toString())) {
builder.append("&");
}
builder.append(name + "=" + originalHttpUrl.queryParameter(name));
}
return builder.toString();
}
private static String generateUserSignature() {
StringBuilder builder = new StringBuilder();
String userSignLowerCase = ""; //Hmac签名
String userSign = ""; //Hmac签名转大写,截取前32位
String timeStamp = String.valueOf(System.currentTimeMillis());
LoginResponseEntity.Data data = UserData.getUser();
if (null != data && !TextUtils.isEmpty(data.getXuehuToken()) && data.getUserId() > 0 && !TextUtils.isEmpty(data.getUserKey())) {
int stringAsciiSum = StringHelp.stringAsciiSum(data.getUserKey() + timeStamp);
String content = data.getXuehuToken() + timeStamp + Constant.APIVersion;
userSignLowerCase = Hmac.getSignature(content, data.getUserKey(), Constant.SignatureType[stringAsciiSum % 5]);
LogHelp.d("lyg", "type: " + stringAsciiSum % 5);
}
if (!TextUtils.isEmpty(userSignLowerCase)) {
if (userSignLowerCase.length() > 32) {
userSign = userSignLowerCase.substring(0, 32).toUpperCase();
} else {
userSign = userSignLowerCase.toUpperCase();
}
builder.append("xuehuToken=" + data.getXuehuToken());
builder.append("&userId=" + data.getUserId());
builder.append("×tamp=" + timeStamp);
builder.append("&userSign=" + userSign);
}
return builder.toString();
}
private static String generateXXTEAEncodedParas(String urlEncodedOriginParas, String userSignature) {
String content = "";
if (!TextUtils.isEmpty(urlEncodedOriginParas)) {
if (!TextUtils.isEmpty(userSignature)) {
content = urlEncodedOriginParas + "&" + userSignature;
} else {
content = urlEncodedOriginParas;
}
} else if (!TextUtils.isEmpty(userSignature)) {
content = userSignature;
}
if (!TextUtils.isEmpty(content)) {
return XXTEA.encode(content, Constant.APPSecret).replace("\n", "");
} else {
return content;
}
}
private static String generateAPPSignature(String xxteaEncodedOriginParas) {
//appId+clientType+format+version+paras
String signContent = Constant.APPId + Constant.ClientType + Constant.APIFormat + Constant.APIVersion + xxteaEncodedOriginParas;
String sign = Hmac.getSignature(signContent, Constant.SignSecret, Constant.SignatureType[1]);
if (!TextUtils.isEmpty(sign)) {
return sign.toUpperCase();
}
return "";
}
}
【框架】网络请求+Gson解析--Retrofit 2的更多相关文章
- 网络请求+Gson解析--Retrofit 2
其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...
- 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
在寻常的开发中常常会有非常多列表页面.每做一个列表页就须要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件. 假设版本号更新迭代比較频繁,如此以往,就会使项目pr ...
- Android网络请求与解析
1.Volley和Gson结合使用——Volley适用于小型数据,多次的请求,使用Gson解析时,服务器数据的键值不能包含常用的标识符如:class.....等,这些就需要与服务端小伙伴商量 这样也可 ...
- Android Http请求框架二:xUtils 框架网络请求
一:对Http不了解的请看 Android Http请求框架一:Get 和 Post 请求 二.正文 1.xUtils 下载地址 github 下载地址 : https://github.com/w ...
- IOS SWIFT 网络请求JSON解析 基础一
前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection ...
- Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名
安卓SDK提供了ConnectivityManager类,那么我们就可以轻松的获取设备的网络状态以及联网方式等信息. 但是要想知道安卓设备连接的网络能不能访问到Internet,就要费一番周折了. 本 ...
- Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示
先分享一个由Json字符串直接生成解析对应的类的工具: jsonclassgenerator14 百度天气接口 下面是由一个小功能(又特么的是天气)的实现,记录下下UAP的流程和结构(其实跟之前一模一 ...
- java HttpClicent网络请求与解析
HttpClicent是Apache下的一个子项目,文档齐全,详见官网:http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html ...
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
随机推荐
- K3已被禁用的基础资料如何显示出来
[基础资料]——[公共资料]——[物料.职员.客户==]——[查看]——[选项]——显示禁用基础资料——确定,就可以看见你所禁用过的基础资料,显示为红色字体! 同类问题example: 金蝶K3 禁用 ...
- HTML超链接
打开网页在 想要查看的位置右键单击 审查元素 则可以查看代码 点击图片右键单独打开 则可以查看图片位置 一.超链接 a标签 <a href="地址"> ...
- 把Tomcat做成系统服务自动启动
用Tomcat的bin目录下的service.bat,cmd,命令:进入到Tomcat的bin目录 service.bat install可以把tomcat做成系统服务;修改下计算机管理里面的服务,找 ...
- [Android Pro] Android 进程级别 和 oom_adj对应关系
一 : 前台进程 (Active Process): oom_adj为0. 前台进程包括 : 1 : 活动 正在前台接收用户输入 2:活动.服务与广播接收器正在执行一个onReceive事件的处理函数 ...
- July 7th, Week 28th Thursday, 2016
The 79th Anniversary of Anti-Japan War Difficulties vanish when faced bodly. 勇敢面对困难,困难自会退让. The best ...
- 3ds max输出图片
通过渲染菜单调出改窗口,然后调整成这种模式,就能渲染出这种效果的图. 可以调背景色: 全局照明:染色,这个控制的是渲染物体的颜色
- Mac 下 gradle 路径
/Users/yourname/.gradle/wrapper/dists cmd:cd ~/.gradle/wrapper/dists/
- C#命名规范的几点建议
1.最好以<Company>.<Component>做为namespace的格式 2.考虑是否需要将namespace设置为复数,如:FCL中的System.Collectio ...
- NYOJ题目770仿射密码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs4AAAIUCAIAAACFKz0yAAAgAElEQVR4nO3dPXLruLaG4TsJ5RqIYw
- Linux snmp
http://www.cnblogs.com/amberly/p/4364072.html http://blog.csdn.net/awenluck/article/details/50220221