Retrofit2的简单使用(一)

来源:互联网 发布:js 设置style display 编辑:程序博客网 时间:2024/05/18 17:44
  • 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";//构建RetrofitRetrofit 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();}
0 0