其实内部是封装了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("&timestamp=" + 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的更多相关文章

  1. 【框架】网络请求+Gson解析--Retrofit 2

    其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...

  2. Android常用网络请求框架Volley Retrofit (okHttp)

    Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient.在 Android 5.0 的时候 Google 就不推荐使用 HttpClient ...

  3. Android网络请求与解析

    1.Volley和Gson结合使用——Volley适用于小型数据,多次的请求,使用Gson解析时,服务器数据的键值不能包含常用的标识符如:class.....等,这些就需要与服务端小伙伴商量 这样也可 ...

  4. 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率

    在寻常的开发中常常会有非常多列表页面.每做一个列表页就须要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件. 假设版本号更新迭代比較频繁,如此以往,就会使项目pr ...

  5. IOS SWIFT 网络请求JSON解析 基础一

    前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection ...

  6. Android网络请求框架之Retrofit实践

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...

  7. Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名

    安卓SDK提供了ConnectivityManager类,那么我们就可以轻松的获取设备的网络状态以及联网方式等信息. 但是要想知道安卓设备连接的网络能不能访问到Internet,就要费一番周折了. 本 ...

  8. Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示

    先分享一个由Json字符串直接生成解析对应的类的工具: jsonclassgenerator14 百度天气接口 下面是由一个小功能(又特么的是天气)的实现,记录下下UAP的流程和结构(其实跟之前一模一 ...

  9. java HttpClicent网络请求与解析

    HttpClicent是Apache下的一个子项目,文档齐全,详见官网:http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html ...

随机推荐

  1. 【学习笔记】FreeMarker 之于Servlet与Stuts2的应用

    FreeMarker应用在Servlet(0配置web.xml形式): 准备环境: tomcat7.eclipse最新版.jdk1.8.freemarker v2.3.20.jar 举例项目结构图: ...

  2. eclipse配置hadoop插件

    1. 版本信息   eclipse windows 64 bit hadoop 2.5.2 64 bit hadoop eclipse-plug 2.5.2   2. 下载hadoop-2.5.2.t ...

  3. 【译】SSH隧道:本地和远程端口转发

    本文是:SSH Tunnel - Local and Remote Port Forwarding Explained With Examples 的译文 有两种方法可以创建SSH隧道,本地和远程端口 ...

  4. JQuery获取被选中的checkbox的value值

    文章源头:http://www.cnblogs.com/td960505/p/6123510.html 以下为使用JQuery获取input checkbox被选中的值代码: <html> ...

  5. Pycharm和IntelliJ IDEA激活 2017.3.x版本

    PyCharm 2017.3.3 (Professional Edition) 已经屏蔽了http://www.imsxm.com/   http-server激活方式,我根据参考教程搭建了一个,如有 ...

  6. Gh0st配置加密与解密算法(异或、Base64)

    1.前言 分析木马程序常常遇到很多配置信息被加密的情况,虽然现在都不直接分析而是通过Wireshark之类的直接读记录. 2017年Gh0st样本大量新增,通过对木马源码的分析还发现有利用Gh0st加 ...

  7. Python Challenge 第 4 关攻略:linkedlist

    代码 import requests url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={}" ...

  8. InfluxDB系列之一安装及简单运维(未完成,需要继续写)

    InfluxDB 是一个开源分布式时序.事件和指标数据库.使用 Go 语言编写,无需外部依赖.其设计目标是实现分布式和水平伸缩扩展. 它有三大特性: 1. Time Series (时间序列):你可以 ...

  9. spring boot jpa 多数据源配置

    在实际项目中往往会使用2个数据源,这个时候就需要做额外的配置了.下面的配置在2.0.1.RELEASE 测试通过 1.配置文件 配置两个数据源 spring.datasource.url=jdbc:m ...

  10. nio复习总结

    观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select  epoll等 reactor: io事件触发时, ...