Retrofit2的简单介绍
Retrofit 是Square开发的网络请求库, 从Retrofit2以后,其内部网络请求用的OKHttp,简化了网络请求的使用。Retrofit+RxJava可以完美地实现android的网络请求。
<一>Retrofit2的简单使用
android studio中,需要引入
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
其中converter-gson用于Gson解析,
converter-scalars用于字符串解析,
converter-jackson用于Jackson解析。
(1)定义一个接口,封装访问的方法
/**
* * 网络请求 *
* Created by jason on 16/7/27.
*/
public interface ApiService {
@GET("/demo")
Call<String> getString(@Query("name") String name,@Query("pass") String pass);
}
注解@GET表示这是一个GET请求,demo是请求名称(URL中请求部分的地址)。getString()是请求的方法名称,返回的是一个Call对象,泛型为String(即服务器返回数据是一个String),@Query("name")
和@Query("pass")
是请求参数 。如果请求参数比较多,也可以用@QueryMap HashMap<String,String> map
。
(2)执行请求
private static String baseUrl = "http://192.168.1.18:8080";
//构建Retrofit
Retrofit stringRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
ApiService apiService = stringRetrofit.create(ApiService.class);
Call<String> call = apiService.getString();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful() && response.errorBody() == null) {
Log.d(TAG, "str:" + response.body().toString());
} else {
Log.d(TAG, "error code:" + response.code());
Log.d(TAG, "error message:" + response.message());
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.d(TAG, "error:" + t.getMessage());
}
});
上述拼接成最终的网络请求地址是http://192.168.1.18:8080/demo
。如上述代码apiService.getString();
返回一个Call对象,接下来调用enqueue方法,enqueue()
方法表示异步请求,execute()
方法表示同步请求。onResponse()
和onFailure()
是请求结果回调。在onResponse()
中,首先需要判断下请求是否成功以及是否有错误信息,这里需要特别注意,单纯从字面上理解,onFailure()
才是接收错误的地方,异常都应该在onFailure()
中处理,但其实并不完全是这样,这里的onFailure()
是接收网络的异常,比如说网络没有连接,或者连接超时,这时会进入onFailure()
方法,但如果是网络正常,但是返回不正常,是会进入onResponse()
方法。
(3)服务器端的servlet
@WebServlet("/demo1")
public class demo1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
String returned ="Hello! android,I am Server!";
writer.write(returned);
writer.flush();
writer.close();
}
}
- <二>Retrofit2网络请求json的简单使用
如果Http返回数据是一个统一的格式,如下:
{
"status":0,
"msg":"成功",
"data":""
}
其中data是不确定的,其有可能是一个对象,也有可能是一个List,故我们将其定义为泛型:
public class HttpResult<T> {
/**
* 服务端数据状态码,0(正常)
*/
private int status;
/**
* 服务端数据状态码对应的提示信息
*/
private String msg;
/**
* 服务端数据的试题部分
*/
private T data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
如果data是一个对象,请求接口如下:
/**
* * 网络请求 *
* Created by jason on 16/7/27.
*/
public interface ApiService {
@GET("/HttpServers/demo1")
Call<HttpResult<User>> getUser();
}
如果data是一个List,请求接口如下:
/**
* * 网络请求 *
* Created by jason on 16/7/27.
*/
public interface ApiService {
@GET("/HttpServers/demo")
Call<HttpResult<List<Person>>> getUsers();
}