retrofit的简单介绍:
Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级且安全的、并使用注解方式的网络请求框架。
okHttp和Retrofit都是square公司推出的开源项目。
优点:
--可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等
--动态代理,用注解来生成请求参数,简化URL拼写,简单易懂
--支持同步、异步和RxJava
--超级解耦
--可以配置不同的反序列化工具来解析数据,如json、xml等
--框架使用了很多设计模式
缺点:
--不能接触序列化实体和响应数据
--执行的机制太严格
--使用转换器比较低效
--只能支持简单自定义参数类型
用retrofit发送get请求的简单示例:
1.配置网络权限
2.配置依赖:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
3.封装请求路径:
public class ApiUrls {
public static final String BASE_URL = "http://192.168.1.103:8080/TakeoutService/";
public static final String HOME = "home";
}
4.创建http请求的api接口
public interface TakeOutApi {
//里面传入的是请求路径
@GET(ApiUrls.HOME)
Call<ResponseInfo> getHomeData();//调用getHomeData()方法可以拿到HOME路径
}
5.创建retrofit对象,然后调用create()得到接口实例
得到接口实例是每一次请求网络都要做的事情,所以应该抽取成一个类,方便调用
/**
* 获取Api接口实例
* @return TakeOutApi Api接口实例
*/
public class HttpUtils {
private static TakeOutApi takeOutApi;
public static TakeOutApi getApi() {
if (takeOutApi == null) {
//创建retrofit实例
Retrofit retrofit = new Retrofit.Builder()
//配置主机地址
.baseUrl(ApiUrls.BASE_URL)
//解析json数据(转化工厂:将json转化成对象)
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.build();
//retrofit.create(接口.class)调用之后会得到接口上的参数HOME然后拼接到baseUrl尾部
takeOutApi = retrofit.create(TakeOutApi.class);
}
return takeOutApi;
}
}
6.MainActivity--用接口实例调用方法得到Call
Call<ResponseInfo> call = HttpUtils.getApi().getHomeData();
7.MainActivity--异步执行请求
call.enqueue(callback);
需要一个callback回调:
首先封装一个响应json数据的一个bean类ResponseInfo
public class ResponseInfo {
public String code;
public String data;
}
回调
Callback<ResponseInfo> callback = new Callback<ResponseInfo>() {
@Override
public void onResponse(Call<ResponseInfo> call, Response<ResponseInfo> response) {
ResponseInfo body = response.body();
String json = body.data;//得到data数据
Log.e(TAG, "请求成功: " + json);
}
@Override
public void onFailure(Call<ResponseInfo> call, Throwable t) {
Log.e(TAG, "请求失败: " + t);
}
};
在这里我们就可以在log里面看到请求到的数据了。
为了让代码更加清晰易懂,可以封装一下回调:
》创建Callback子类SimpleCallback
public class SimpleCallback implements Callback<ResponseInfo> {
@Override
public void onResponse(Call<ResponseInfo> call, Response<ResponseInfo> response) {
ResponseInfo body = response.body();
String json = body.data;
if (TextUtils.isEmpty(json)) {
showError(0, new RuntimeException("取得的数据为空"));
} else {
showData(1, json);
}
}
@Override
public void onFailure(Call<ResponseInfo> call, Throwable t) {
showError(-1, t);
}
//显示错误的方法
protected void showError(int i, Throwable t) {}
//显示数据的方法
protected void showData(int i, String json) {}
}
》MainActivity--回调:
SimpleCallback callback = new SimpleCallback() {
@Override
protected void showError(int i, Throwable t) {
super.showError(i, t);
Toast.makeText(MainActivity.this, "请求网络失败", Toast.LENGTH_SHORT).show();
}
@Override
protected void showData(int i, String json) {
super.showData(i, json);
Toast.makeText(MainActivity.this, "请求到数据", Toast.LENGTH_SHORT).show();
Log.e(TAG, "请求到数据: " + json);
}
};
okhttp读取json文件示例
1.添加网络权限。
2.添加依赖:
compile 'com.squareup.okhttp:okhttp:2.0.0'
3.用okhttp读取网络json文件:
-创建OkHttpClient实例
-创建请求
-异步回调
private void loadJson(String path) {//path就url接口
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(path).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.e(TAG, "请求失败" + e);
}
@Override
public void onResponse(Response response) throws IOException {
String json = response.body().string();
Log.e(TAG, "请求成功 ,json数据:" + json);
processData(json);//解析json数据
}
});
}