Retrofit2.0+Gson+RxJava 框架 第一个例子 【Android】

废话不多说,开门见山!

先看一下我的工作目录:

学过后端框架的都知道,这是一个有点类似于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格式数据,在多平台下,后端可以兼容所有客户端。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值