文章标题

Retrofit框架使用

最近Retrofit使用比较火,并且框架的使用也比较简单,代码逻辑看起来也比较清晰。故研究了一下它的使用。
- jar包依赖:okhttp,gson
- 官网定义Retrofit

  • 接口定义
public class ApiClient {
    private static TestApiInterface mtestService;

    public static TestApiInterface getTwitchTvApiClient() {
        if (mtestService == null) {

            RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("http://ipAddress:8080/AppClient/app")
            .build();

            mtestService = restAdapter.create(TestApiInterface.class);
        }

        return mtestService;
    }

    public interface TestApiInterface {
        @POST("/login/getButtonsByUser")
        void getStreams(@Query("userView") String limit,
                        Callback<JustinTvStreamData> callback);
        //body形式参数
        @POST("/sprint/app/api.htm")
        void getStreams(@Body EarningDatas data,
                        Callback<Response> callback);
    }

}
  • 使用
ApiClient.getTwitchTvApiClient().getStreams(data, new Callback<Response>() {

                /*@Override
                public void failure(RetrofitError arg0) {
                }

                //自动解析成javaBean对象
                @Override
                public void success(JustinTvStreamData arg0, Response arg1) {

                }*/

                @Override
                public void failure(RetrofitError arg0) {

                }

                @Override
                public void success(Response arg0, Response arg1) {
                    //自己解析结果
                    String jsonString = new String(((TypedByteArray) arg0.getBody()).getBytes());
                    String jsonString1 = new String(((TypedByteArray) arg1.getBody()).getBytes());

                    //fastjson解析成jsvaBean
                    JustinTvStreamDatadata=JSON.parseObject(jsonString,JustinTvStreamData.class);
                }

            });
  • 测试数据JavaBean:
public class JavaBean implements Serializable  {
public boolean ret  ;
public String msg  ;
public List<Consignment> consignment;

   public class Consignment implements Serializable  {
   public Double price  ;
   public String payer  ;
   public String date  ;
   public String name  ;
   public String id  ;
   public String time  ;
   public int status  ;
   }
}
  • cache
  • 内容来源自链接内容正确没有测试
public class RestClient {
public static final String BASE_URL = "http://something.example.net/JSONService";
private com.ucc.application.rest.ApiService apiService;

public RestClient() {
    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
            .create();



    RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(BASE_URL)
            .setClient(new OkClient(OkHttpSingleTonClass.getOkHttpClient()))
            .setConverter(new GsonConverter(gson))
            .build();

    apiService = restAdapter.create(com.ucc.application.rest.ApiService.class);
}

public com.ucc.application.rest.ApiService getApiService() {
    return apiService;
}

}
public class OkHttpSingleTonClass {


private static OkHttpClient okHttpClient;

private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());
        return originalResponse.newBuilder()
                .header("Cache-Control", String.format("max-age=%d, only-if-cached, max-stale=%d", 120, 0))
                .build();
    }
};

private OkHttpSingleTonClass() {
}

public static OkHttpClient getOkHttpClient() {
    if (okHttpClient == null) {
        okHttpClient = new OkHttpClient();
        createCacheForOkHTTP();
        okHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
    }
    return okHttpClient;
}

private static void createCacheForOkHTTP() {
    Cache cache = null;
    cache = new Cache(getDirectory(), 1024 * 1024 * 10);
    okHttpClient.setCache(cache);
}

public static File getDirectory() {
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "UCC" + File.separator);
    root.mkdirs();
    final String fname = UserUtil.CACHE_FILE_NAME;
    final File sdImageMainDirectory = new File(root, fname);
    return sdImageMainDirectory;
}

}
  • https链接内容正确没有验证
前期使用httpclient与asyncTask进行接口实现, 由于后续httpclient整个被标记为过期,所以决定采用retrofit或者volley重构接口调用。两个框架都是比较优秀的,基于我原有项目架构比较适合采用retrofit,所以决定使用retrofit。
        具体重构方式我就不具体描述了,和自己写线程做异步调用区别不大,主要就是client使用了okhttpclient,默认支持gson,我原来就是基于gson做json解析。
        另外现在网络的安全性问题,所以越来越多的服务开始采用https,我的服务端接口也是采用了https接口。但是访问https接口需要考虑如何导入证书,缓存如何实现。
        1、证书部分比较简单,把导出的证书直接放到, 项目res/raw目录下,加载证书代码如下:
InputStream inputStream = null;
inputStream = context.getResources().openRawResource(R.raw.证书名);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate certificate = certificateFactory.generateCertificate(inputStream);
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
keyStore.load(null, null);
keyStore.setCertificateEntry("trust", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
mOkHttpClient = new OkHttpClient();
mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
mOkHttpClient.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
if (HOST_NAME.equals(hostname))
return true;
return false;
}
});
证书到此就加载到okhttpclient中,然后在adapter中配置client就可以
RestAdapter restAdapter = new RestAdapter.Builder()
.setClient(new OkClient(mOkHttpClient))
.setEndpoint(API_URL).build();
关于缓存查过很多资料,网上提供信息比较有限,最后还是通过自己反复测试得出的一个结果,也欢迎大牛们提提意见。
首先,需要给okhttpclient设置一个缓存文件
File cacheDir = new File(context.getCacheDir(), RESPONSE_CACHE);
mOkHttpClient.setCache(new Cache(cacheDir, RESPONSE_CACHE_SIZE));

那么response的缓存如何生效呢,是根据response返回的cache-control确定的,所以这个和服务端的反回结果有关,我将服务端的反回的cache-control设置为max-age=900,那么有效期为15分钟,当然在发起请求过程中,也是要带cache-control,其中值可以控制是否访问缓存,如果需要访问缓存那么值就可以设置为max-age=900, 如果不需要那么值就设置为max-age=0即可。具体代码就是addheader,我就不详细说了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值