Retrofit2的简单使用(一)

  • 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();

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值