您的位置:首页 > 其它

文章标题

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,我就不详细说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: