废话不多说,开门见山!
先看一下我的工作目录:
学过后端框架的都知道,这是一个有点类似于MVC Web后端的一个包路径。
具体步骤如下
1.导包。
在build.gridle中加入下列依赖。
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
2.创建RetrofitFactory工程类
使用单例模式创建RetrofitFactory工厂类。其中URL为整个项目的根目录地址,注意,这里最好以 '/' 为结束符。
public class RetrofitFactory {
private final static String URL="http://192.168.191.1:8080/hps/";
private static Retrofit retrofit=null;
public static Retrofit createRetrofit(){
if(retrofit==null){
synchronized (RetrofitFactory.class){
if(retrofit==null){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(8, TimeUnit.SECONDS)
.build();
retrofit=new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.baseUrl(URL)
.build();
}
}
}
return retrofit;
}
}
3.创建Service接口
关于注解,后面我会一一解说。这里@POST(url)这个学过web都能理解,这表示这个请求使用POST提交,其中url为请求地址,而@FormUrlEncoded表明这里使用表单方式提交。
这里定义了一个请求,也就是登录,其中@POST("user/validate.mvc")表明请求方式为POST,请求地址为:根目录+user/validate.mvc,其中根目录也就是工厂类中所提及的URL。而使用注解@FieldMap表名参数param为请求参数。这里使用Map<String,Object>,其中,map中的key为请求参数,value为请求值。
public interface UserService {
@FormUrlEncoded
@POST("user/validate.mvc")
Call<ResponseBody> login(@FieldMap Map<String,Object> param);
}
4.请求
通过调用Retrofit中的Create()方法自动创建所定义接口的对象,再调用接口中的请求方法,返回一个Call<ResponseBody>类型对象,最后通过该对象的enqueue()方法发起异步请求,实现网络请求。代码如下。
public class UserController {
public static UserService userService= RetrofitFactory.createRetrofit().create(UserService.class);
public static void login(String username, String password, final NetCallback callback) {
Map<String,Object> map=new HashMap<>();
map.put("userId",username);//增加参数userId
map.put("password",password);//增加参数password
//使用异步方式请求
Call<ResponseBody> call=userService.login(map);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//请求成功逻辑
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//请求失败逻辑
}
});
}
}
注解
1.@FormUrlEncoded和@Multipart
@FormUrlEncoded主要用于表单提交,也就是没有文件提交时使用的注解。
@Multipart主要用于文件提交,当有文件提交时,使用该注解。
@Streaming响应体的数据用流的形式返回。
2.请求方式注解
@POST( url ):对应post请求,其中url为请求子地址,常用。
@GET( url ):对应get请求,常用。
@HTTP( method = "", path = "", hasBody = true|false ),其中method 对应以上几种方法,path为请求路径。常用。
例子:
public interface BlogService{
@HTTP(method = "post", path = "login.mvc", hasBody = false)
Call<ResponseBody> login(@Field("id") String id, @Field("password") String password);
}
3.参数注解
@Field:注解普通参数,一般使用再标记为@FormUrlEncoded的请求下。可注解String,int 或者自定义 类型。
@FieldMap:注解较复杂的参数集合,多个@Field可以用@FieldMap代替。一般注解Map<String, Object>类型。
@Part和@PartMap :类似于@Field和FieldMap,与之不同的是用于标记为@Multipart,也就是当请求包含文件时使用。
@Query和@QueryMap:查询参数。类似于上面几个,但又有区别。
一般建议,在没有文件上传情况下使用@Field和@FieldMap,在文件上传情况下,一般参数必须使用@QueryMap和@Query,文件类型参数无限制。
在上传文件情况下,普通参数使用@Part和@PartMap会产生某些bug,这里就不明说,自己可以体会体会一下,可以使用抓包软件看看具体的情况。
(完)
关于gson解析的情况另一篇博客,主要用于解析Json格式的数据,建议后端使用Rest API风格,也就是后端返回JSON格式数据,在多平台下,后端可以兼容所有客户端。