网络请求+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 ...
 
随机推荐
- 深入分析Parquet列式存储格式
			
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存储 列式存 ...
 - Docker 初相见
			
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
 - phpunit安装出错的原因及解决办法
			
官方指引 很遗憾, phpunit还没有在ArchLinux的仓库里. 所以使用下载安装的方式.按照官方的指引: wget https://phar.phpunit.de/phpunit.phar c ...
 - Bzoj1939 [Croatian2010] Zuma
			
Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 43 Solved: 31 Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 ...
 - 20155315 2016-2017-2 《Java程序设计》第六周学习总结
			
教材学习内容总结 第10章 输入与输出 1.串流设计的概念 从应用程序角度看,将数据从来源取出,可以使用输入串流,将数据写入目的地,可以使用输出串流:在Java中,输入串流代表对象为java.io.I ...
 - 【leetcode 简单】 第六十六题 用栈实现队列
			
使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是否为空. ...
 - POJ   1185    炮兵阵地    (状态压缩DP)
			
题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...
 - vue项目的配置
			
1.第一首先我们先安装:visual studio code开发环境,可以换成中文版的. 2.安装note.js 下载链接:https://nodejs.org/en/ 3.安装npm使用淘宝镜像 ...
 - Python基础入门(一)
			
1.在线教程 2.Python下载地址,安装步骤,就是next.next... 3.配置环境变量(win8) 电脑 --> 属性 --> 高级系统设置 --> 环境变量,找到系统变量 ...
 - SolrJ查询条件组合查询实现——(十六)
			
带查询条件的实现原理: 查询按钮被包在一个大表单,表单还有三个隐藏域,一个商品筛选,一个 价格,一个排序,每次点击查询时候清空三个隐藏域,就带着一个大条件去查询;点击下面的筛选条件时,给隐藏域的筛选条 ...