文章标题
2016-04-11 14:47
274 查看
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,我就不详细说了。
相关文章推荐
- Hibernate内存溢出分析一例
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
- 分页
- lintcode:交错正负数
- Orthographic camera-正交摄像头
- 11个人气超高的设计素材汇总网站
- pat1002
- web Android手机调试chrome://inspect/
- YTUOJ之最快合并链表(线性表)
- jstl varStatus 计数
- JAVA学习---集合系列---PriorityQueue
- 作业4:结对编程项目四则运算
- 动态规划3-------poj1050
- Jackson 高性能的JSON处理 ObjectMapper
- 数据仓库之三种事实表
- 关于deselectRowAtIndexPath
- UVA103动态规划之DAG上的最长路及其字典序
- <css 十一>relative相对定位、absolute绝对定对
- github添加远程仓库报错:fatal: remote origin already exists.
- mysql数据库