网络请求+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 ...
- Android常用网络请求框架Volley Retrofit (okHttp)
Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient.在 Android 5.0 的时候 Google 就不推荐使用 HttpClient ...
- Android网络请求与解析
1.Volley和Gson结合使用——Volley适用于小型数据,多次的请求,使用Gson解析时,服务器数据的键值不能包含常用的标识符如:class.....等,这些就需要与服务端小伙伴商量 这样也可 ...
- 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
在寻常的开发中常常会有非常多列表页面.每做一个列表页就须要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件. 假设版本号更新迭代比較频繁,如此以往,就会使项目pr ...
- IOS SWIFT 网络请求JSON解析 基础一
前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection ...
- Android网络请求框架之Retrofit实践
网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...
- 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 ...
随机推荐
- Chrome 清除某个特定网站下的缓存
打开开发者工具(F12),选择 Network--Disable cache 即可.需要清除某网站缓存时 F12 打开开发者工具就会自动清除这个网站的缓存,而不必清除所有网站的缓存了.
- UNIX网络编程 第8章 基本UDP套接字编程
UDP是无连接的,不需要accept,TCP通过accept API来接受连接,并且将连接客户端的信息写入到accept将返回的新socket中,该新socket中有服务端和客户端的IP地址和端口,因 ...
- boost::bind的使用
最近在几经波折之后,终于对于boost::bind有点理解了.对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法.其实这得益于c++的模板以及操作 ...
- web项目启动首页能访问接口报404
这个问题如果控制台没有报错,然后看一下日志,看看spring容器是否加载: 如果是一直卡在这里了,多半是resources文件下的配置有问题,或者是resources目录不是源文件,工具无法识别 我遇 ...
- 【算法学习】有旋treap
treap是平衡树的一种.与其他平衡树一样,它也能够支持插入和删除,求第k极值等,接下来我们主要探讨有旋treap的实现过程. treap中每个节点要维护其值,左右孩子以及子树大小.父亲要不要写则看你 ...
- nginx配置浅析
一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...
- 【算法】Base64编码
1.说明 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. 2.编码 ASCII码 -> 十六进制码 -> ...
- 查看linux服务器内存信息
查看服务器内存信息 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size [root@localhost home]# dmideco ...
- MySQL分页存储过程
CREATE PROCEDURE ProcPage(in tableName varchar(20),#表名 in showField varchar(100),#要显示的列名 in whereT ...
- pre,html转义,abbr缩写,表格table
<pre></pre>预定义文本标签pre(保留换行和空格) <sdds>对html转义 <abbr title="sddsdsds"&g ...