天天看点

Retrofit2.0+网络框架HTTP实战

上文介绍了搭建本地服务端,Android客户端是进行普通的HTTP请求,今天我基于此servlet,继续介绍一种新的网络请求方式,就是目前比较流行的一种框架:Retrofit。Retrofit是一款面向Android和Java的类型安全的HTTP客户端框架,简单方便。可以通过注解的方式,申明请求的方式和参数。它很强大,支持GET, POST, PUT, DELETE, and HEAD.等请求。

一,Retrofit的特点

1,支持URL参数的替换和请求参数查询

2,Object类型转换为请求体,如JSON,buffers

3,支持Multipart,大文件上传。

下面举例来介绍。

二,服务端搭建,提供访问的接口

上文我已经搭建来一个简单的servlet接口,客户端访问时传username参数,server会返回json字符串。详情请看:

搭建本地server,响应Android客户端HTTP请求

三,使用传统的HTTP请求方式访问接口

之前我们通常会使用第三方框架,比如使用OKHTTP,我另外有介绍: Android网络请求:OkHttp实战

或者像我这样自己封装请求:

//测试本地servlet接口,可以get,也可以post
public static void testMyServlet(){
        String baseUrl="http://192.168.1.103:8080/Android/";
        String url = baseUrl+"servlet/LoginServlet";
        String url2 = baseUrl+"servlet/LoginServlet?username=duqian223";
//OairHttpHelper.sendPost(OairHttpHelper.Method_Get, url2, null, new OairHttpHelper.OairHttpListener() {
        OairHttpHelper.sendPost("POST", url, "username=dusan2016&age=25", new OairHttpHelper.OairHttpListener() {
            @Override
            public void onSuccess(String result) {
                LogUtils.debug(TAG,"MyServlet result="+result);
            }
            @Override
            public void onFailure(Exception e) {           LogUtils.debug(TAG,"error="+e.toString());
            }
        });
    }
           

封装的内部实现不用说了吧,就是HTTPURLConnection请求。返回结果一个简单的json:

{"username":"dusan2016"}
           

三,使用Retrofit进行HTTP请求

1,首先,定义API服务接口

注解的形式声明GET和POST请求,login是方法名,后面不带参数的为GET请求,参数写在URL中,有参数的写在方法里面,通过Query形式。Call是范型,返回请求后得到的javaBean对象,本文为TestBean,代码如下:

/**
 * 封装json为TestBean
 * Created by duqian on 16/5/3.
 */
public class TestBean {
    public String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "TestBean{" +
                "username='" + username + '\'' +
                '}';
    }
}
           

使用Retrofit进行HTTP请求的定义

/**
 * retrofit for HTTP
 * Created by duqian on 16/5/3.
 */
public interface OairApiService {
    @POST("servlet/LoginServlet")
    Call<TestBean> login(@Query("username") String username);
    @GET("servlet/LoginServlet?name=duqian2016")
    Call<TestBean> login();
}
           

2,实现API服务接口OairApiService

public static void testRetrofit() {
        baseUrl = "http://192.168.1.103:8080/Android/";//根URL
        //创建Retrofit实例,实现OairApiService接口
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)       .addConverterFactory(GsonConverterFactory.create())
                .build();
        OairApiService oairAPIService = retrofit.create(OairApiService.class);
        //发送Post请求,不带参数为GET请求
        final Call<TestBean> call = oairAPIService.login("Dusan2016");
        call.enqueue(new Callback<TestBean>() {
            @Override
            public void onResponse(Call<TestBean> call, Response<TestBean> response) {
                String result = response.body().toString();
                LogUtils.debug(TAG,"result="+result);
            }

            @Override
            public void onFailure(Call<TestBean> call, Throwable t) {
                LogUtils.debug(TAG,"error "+t.toString());
            }
        });
}
           

测试通过,返回结果如下:

result=TestBean{username='Dusan2016'}
           

3,Android studio依赖

//android studio开发,请添加最新的retrofit,本例通过Gson解析json,添加对应的依赖:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
           

四,retrofit其他请求方式

官方提供了很多请求方式的说明。get请求,可以在URL中修改参数,在实际请求的时候,传入参数动态修改URL。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
           

另外,还可以添加查询的参数

//简单的参数
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
//复杂的参数写法,用map集合
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
           

表单提交是常见的请求方式,声明为form表单提交,可以这样写:

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
           

文件上传同样支持,通过注解的方式,添加请求体和表述文字:

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
           

如果要添加请求头,我们可以用注解的方式@Headers:

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
//或者这样动态的添加Header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
           

五,总结

本文只是以一个简单的demo为例,介绍了retrofit的基本使用,并解释了官方的一些用法。是不是瞬间觉得,简单大气上档次。其实,真实项目中使用,会发现它的确很强大,很多实用的功能,内部实现原理也很有意思。

未完待续,杜乾,Dusan,Q 291902259,欢迎交流。