之前介绍了搭建本地服务端,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实战 或者像我这样自己封装请求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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("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:1
{"username":"dusan2016"}
三,使用Retrofit进行HTTP请求 1,首先,定义API服务接口 注解的形式声明GET和POST请求,login是方法名,后面不带参数的为GET请求,参数写在URL中,有参数的写在方法里面,通过Query形式。Call是范型,返回请求后得到的javaBean对象,本文为TestBean,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* 封装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请求的定义
1
2
3
4
5
6
7
8
9
10
* 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 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void testRetrofit () {
baseUrl = "http://192.168.1.103:8080/Android/" ;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create())
.build();
OairApiService oairAPIService = retrofit.create(OairApiService.class);
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());
}
});
}
测试通过,返回结果如下:
1
result=TestBean{username='Dusan2016' }
3,Android studio依赖 //android studio开发,请添加最新的retrofit,本例通过Gson解析json,添加对应的依赖:
1
2
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
四,retrofit其他请求方式 官方提供了很多请求方式的说明。get请求,可以在URL中修改参数,在实际请求的时候,传入参数动态修改URL。
1
2
@GET ("group/{id}/users" )
Call<List<User>> groupList(@Path ("id" ) int groupId);
另外,还可以添加查询的参数
1
2
3
4
5
6
@GET ("group/{id}/users" )
Call<List<User>> groupList(@Path ("id" ) int groupId, @Query ("sort" ) String sort);
@GET ("group/{id}/users" )
Call<List<User>> groupList(@Path ("id" ) int groupId, @QueryMap Map<String, String> options);
表单提交是常见的请求方式,声明为form表单提交,可以这样写:
1
2
3
@FormUrlEncoded
@POST ("user/edit" )
Call<User> updateUser (@Field("first_name" ) String first, @Field ("last_name" ) String last) ;
文件上传同样支持,通过注解的方式,添加请求体和表述文字:
1
2
3
@Multipart
@PUT ("user/photo" )
Call<User> updateUser (@Part("photo" ) RequestBody photo, @Part ("description" ) RequestBody description) ;
如果要添加请求头,我们可以用注解的方式@Headers:
1
2
3
4
5
6
@Headers ("Cache-Control: max-age=640000" )
@GET ("widget/list" )
Call<List<Widget>> widgetList();
@GET ("user" )
Call<User> getUser (@Header("Authorization" ) String authorization)
五,总结 本文只是以一个简单的demo为例,介绍了retrofit的基本使用,并解释了官方的一些用法。是不是瞬间觉得,简单大气上档次。其实,真实项目中使用,会发现它的确很强大,很多实用的功能,内部实现原理也很有意思。 未完待续,杜乾,Dusan,Q 291902259,欢迎交流。