Retrofit解析

Retrofit(原意:改进,改良)是Square公司开源的一个高质量高效率的http库,目前非常流行的网络框架,效率高,实现简单。运用注解和动态代理,极大地简化了网络请求的繁琐步骤。

特点是:

  • 性能好,处理快,使用简单,目前最流行的HTTP Client库之一
  • 使用REST API非常方便
  • 支持NIO(新的IO API,可以替代标准的Java IO API)
  • Retrofit默认使用OKHttp处理网络请求
  • 默认使用Gson解析

1、导入依赖库

第一种:在gradle文件中添加compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

同步后External Libraries中增加:

  • retrofit-2.0.0-beta4
  • okhttp-3.0.1
  • okio-1.6.0
第二种:在gradle文件中添加compile 'com.squareup.retrofit2:converter-goon:2.0.0-beta4'

同步后External Libraries中增加:

  • retrofit-2.0.0-beta4
  • okhttp-3.0.1
  • okio-1.6.0
  • gson-2.4
  • converter-gson-2.0.0-beta4

2、Retrofit2中网络访问常用注解接口

  1. @GET     GET网络请求方式
  2. @POST    POST网络请求方式
  3. @Headers 头信息参数
  4. @Path 路径参数。替换url地址中{}所括的部分
  5. @Query 查询参数。将在url地址中追加类似“page=1”的字符串,形成提交给服务器端的请求参数
  6. @QueryMap 查询参数集合。在url地址中追加类似“type=text&count=30&page=1”的字符串
  7. @FormUrlEncoded 对表单域中填写内容进行编码处理,避免乱码
  8. @Field 指定form表单域中每个控件的name及相应数值
  9. @FieldMap表单域集合
  10. @MultipartPost提交分块请求,如果上传文件,必须指定Multipart
  11. @PartPost提交分块请求
  12. @BodyPost提交分块请求
3、Retrofit2代码实现步骤

  1. 定义一个接口(封装URL地址和数据请求)
  2. 实例化Retrofit
  3. 通过Retrofit实例创建接口服务对象
  4. 接口服务对象调用接口中方法,获得Call对象
  5. Call对象执行异步请求
4、GET网络请求中接口的写法

4.1无参GET请求方式使用

  • (1)定义一个接口(封装URL地址和数据请求)
  • public interface MyServerInterface {
        /**
         * Get请求无参请求
         * @return
         */
        @GET("article/list/latest?page=1")//封装的URL
        Call<ResponseBody> getlatestJsonString();//自定义方法,返回回调接口Call
    }
  • (2)实例化Retrofit
  •  Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Constant.URL_BASE)//Constant.URL_BASE  = "http://m2.qiushibaike.com/"   在请求时,就会将BaseUrl和@GET中的地址拼接起来
                    .build();
  • (3)通过Retrofit实例创建接口服务对象
  • MyServerInterface myServerInterface = retrofit.create(MyServerInterface.class);
  • (4)接口服务对象调用接口中方法,获得Call对象
  • Call<ResponseBody> responseBodyCall = myServerInterface.getlatestJsonString();
  • (5)Call对象执行异步请求
  • responseBodyCall.enqueue(new Callback<ResponseBody>() {
                /**
                 * 请求成功
                 * @param call
                 * @param response
                 */
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    if (response.isSuccessful()) {
                        try {
                            textView_info.setText(response.body().string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                /**
                 * 请求失败
                 * @param call
                 * @param t
                 */
                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
    
                }
            });

插曲一:BaseUrl  的拼接方式


插曲二:GET请求,方法中无参,但在@URL里定义了完整的URL路径如下

@GET("http://img.265g.com/userup/1201/201201071126534773.jpg")
Call<ResponseBody> getNetworkData();

这种情况下BaseUrl会被忽略,可以用在下载图片

4.2有参GET请求,方法中指定@Path参数和@Query参数。使用方式

  • (1)定义一个接口(封装URL地址和数据请求)
  • public interface MyServerInterface {
        /**
         * Get请求无参请求
         * @return
         */
        @GET("article/list/latest?page=1")
        Call<ResponseBody> getlatestJsonString();
    
        /**
         * GET请求  有参请求
         * @param type
         * @param page
         * @return
         */
        @GET("article/list/{type}?")
        Call<QiushiModel> getInfoList(@Path("type") String type, @Query("page") int page);//QiushiModel为Model模型
    
    }
    
  • (2)实例化Retrofit
  • Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Constant.URL_BASE)
                    //增加返回值为Gson的支持(以实体类返回)  
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

  • (3)通过Retrofit实例创建接口服务对象
  • MyServerInterface myServerInterface = retrofit.create(MyServerInterface.class);
  • (4)接口服务对象调用接口中方法,获得Call对象
  •   Call<QiushiModel> qiushiModelCall = myServerInterface.getInfoList("latest", 1);
  • (5)Call对象执行异步请求
  •  qiushiModelCall.enqueue(new Callback<QiushiModel>() {
                /**
                 * 请求成功
                 * @param call
                 * @param response
                 */
                @Override
                public void onResponse(Call<QiushiModel> call, Response<QiushiModel> response) {
                    if(response.isSuccessful()&&response.body()!=null){
                        List<QiushiModel.ItemsBean> itemsBeen = response.body().getItems();
                        
                    }
                }
                /**
                 * 请求失败
                 * @param call
                 * @param t
                 */
                @Override
                public void onFailure(Call<QiushiModel> call, Throwable t) {
                    
                }
            });

4.3GET请求,表单的提交,@QueryMap的使用方式

接口中定义:

 	/**
    	 * GET 请求Map形式参数,形如表单提交
    	 * @param map
    	 * @return
    	 */
   	 @GET("MyWeb/RegServlet")
   	 Call<ResponseBody> getRegInfo(@QueryMap Map<String,String> map);
参数传递:

	Map<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("password", pwd);
        map.put("age", age);
        Call<ResponseBody> responseBodyCall = myServerInterface.getRegInfo(map);
        responseBodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if(response.isSuccessful()&&response.body()!=null){
                    try {
                        textView_result.setText(response.body().string());
                    } catch (IOException e) {

                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
下篇说说Post请求。


谢谢Steven老师!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值