网络框架之Retrofit2

网络框架之_Retrofit2

概述

  • Restrofit框架是Square公司出品的网络框架;运用注解和动态代理,极大的简化了网络请求的繁琐步骤,非常适合处理Restful网络请求。
  • 主要特点:
    1. 性能好,处理快,使用简单。目前android最流行的Http库之一(速度比Volley更快)
    2. 使用Rest api很方便
    3. 支持NIO(新的IO的API,可以替代标准的Java IO API)
    4. Retrofit默认使用OKHttp处理网络请求,默认使用Gson解析

如何引用

  • 在build.gradle中添加引用
  • compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  • 同步后External Libraries中添加:

Retrofit2中常用的注解接口

  1. @GET GET网络请求方式
  2. @Headers 头信息参数
  3. @Path 路径参数。替换url中“{”和“}”所括的部分
  4. @Query 查询参数。将在url地址中追加类似”name=user”的字符串,组成提交给服务器端的请求参数
  5. @QueryMap 查询参数集合。在url地址中追加类似“page=1&size=20”的字符串
  6. @Url URL参数,此时@Get后无需内容

  7. @POST POST网络请求方式

Http使用方式


具体步骤如下
  1. 定义一个接口(封装url地址和数据请求)
  2. 实例化Retrofit
  3. 通过Retrofit创建接口服务对象
  4. 接口服务对象调用接口中的方法,获取Call对象
  5. Call对象执行请求(异步,同步请求)
Retrofit2中的Url中定义
  1. 这里写图片描述
  2. 总结起来:
    1. 基本的url 要以 / 结尾
    2. 拼接的path 不要以/开头
Get网络请求中接口的写法
  1. Get请求,方法中无参数

    @GET("article/list/latest?page=1")
    Call<ResponseBody> getData();
    
  2. Get请求,方法中指定@Path参数和@Query参数。@path参数用于替换url中{}的部分,@Query将在url地址中追加类似”page=1”的字符串

    @GET("article/list/{type}?")
    Call<QSBean> getInfoData(@Path("type") String type, @Query("page") int page);
    
  3. Get请求,提交表单数据。方法中定义@QueryMap参数。@QueryMap将url地址中追加类似“type=text&count=30&page=1”的字符串;

    @GET("lll/register")
    Call<ResponseBody> getRegInfo(@QueryMap Map<String, String> map);
    
  4. Get请求,方法中无参数。但是@Get中定义了完整的路径,这种情况下baseurl会被忽略

    @GET("http://img4q.duitang.com/uploads/people/201604/15/20160415120706_BT8UE.jpeg")
    Call<ResponseBody> getImg();
    
  5. Get请求,@Url用法

    @GET
    Call<ResponseBody> getImg(@Url String url);
    
  6. Retrofit下载文件,会直接读到内存中,这样如果下载的文件很大,就会报OOM异常。大文件的下载,为了避免OOM的发生,需要边下载到内存,边保存到sd卡里。。

    @Streaming
    @GET
    Call<ResponseBody> getBigData(@Url String url);
    
Post访问接口中的写法
  1. @Field参数;分别指定表单控件的名称。

    @FormUrlEncoded
    @POST("app/gift/gift_list/")
    Call<ResponseBody> postGiftList(@Field("platform") String platform,
                                @Field("gifttype") String gifttype,
                                @Field("compare") String compare);
    
  2. @FieldMap参数:通过map集合指定所有表单控件名称

    @FormUrlEncoded
    @POST("app/gift/gift_list/")
    Call<ResponseBody> postGiftListMap(@FieldMap Map<String, String> map);
    
  3. @Part参数:指定file控件的名称以及上传后文件的名称

  4. @Body参数:向服务器上传多个文件以及其他表单域数据

代码如下:

IService

public interface IService {

    //=======================================================================
    // GET请求方式
    //=======================================================================
    @GET("v2/channels/100/items?limit=20&ad=2&gender=1&offset=0&generation=1")
    Call<ResponseBody> getData();

    @GET("article/list/{type}?")
    Call<ResponseBody> getInfoData(@Path("type") String type, @Query("page") int page);

    @GET("article/list/{type}?")
    Call<QSBean> getBeanData(@Path("type") String type, @Query("page") int page);

    @GET("v2/channels/100/items?")
    Call<ResponseBody> getQueryData(@QueryMap Map<String, String> map);

    @GET
    Call<ResponseBody> getImg(@Url String url);


    //=======================================================================
    // Post方式
    //=======================================================================
    //`platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
    @FormUrlEncoded
    @POST("app/gift/gift_list/")
    Call<ResponseBody> postField(@Field("platform") int platform,
                                 @Field("gifttype") int type,
                                 @Field("compare") String compare);

    @FormUrlEncoded
    @POST("app/gift/gift_list/")
    Call<ResponseBody> postFieldMap(@FieldMap Map<String, String> params);

}

Constant

public interface Constant {

    //
    String BASE_URL = "http://api.liwushuo.com/";

    String BASE_URL_QB = "http://m2.qiushibaike.com/";

    String BASE_URL_PIC = "http://img4q.duitang.com/";

    String BASE_URL_GIFT="http://zhushou.72g.com/";
}

GetActivity

public class GetActivity extends AppCompatActivity {

    @BindView(R.id.tv_result)
    TextView mTvResult;
    @BindView(R.id.btn_get_url)
    Button mBtnGetUrl;
    @BindView(R.id.btn_query)
    Button mBtnQuery;
    @BindView(R.id.btn_querymap)
    Button mBtnQuerymap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get);
        ButterKnife.bind(this);

    }


    @OnClick({R.id.btn_get_url, R.id.btn_query, R.id.btn_querymap})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_get_url:
                loadGetData();
                break;
            case R.id.btn_query:
//                queryInfo();
                queryData();
                break;
            case R.id.btn_querymap:
                queryMapData();
                break;
        }
    }


    private void loadGetData() {
        //2. 创建出来Retrofit实例对象
        //必须添加一个基本的url
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL) //添加基本的url
                .build();
        //3.创建出来接口IService的实例对象
        IService iService = retrofit.create(IService.class);
        //4.调用接口中定义的方法,去得到返回值
        Call<ResponseBody> call = iService.getData();
        //5.通过Call对象,可以进行同步网络请求,或者异步网络请求
        //5.1同步方式
//        try {
//            Response<ResponseBody> response = call.execute();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        //5.2异步方式
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.i("tag", "onResponse:" + Thread.currentThread().getName() + ":" + Thread.currentThread().getId());

                //TODO 当前方法运行在主线程,可以直接更新UI
                //请求成功时,可以通过第二个参数得到响应对象。
                try {
                    String result = response.body().string();
                    mTvResult.setText(result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                //TODO 当前请求失败的方法,运行在主线程,可以直接更新UI
            }
        });
    }


    private void queryInfo() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL_QB)
                .build();
        IService iService = retrofit.create(IService.class);
        Call<ResponseBody> call = iService.getInfoData("latest", 1);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String result = response.body().string();
                    QSBean qsBean = new Gson().fromJson(result, QSBean.class);
                    mTvResult.setText(qsBean.getCount() + "");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

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

            }
        });
    }

    private void queryData() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL_QB)
                .addConverterFactory(GsonConverterFactory.create()) //加上Gson解析器,内部会自动把得到的json字符串,转换成相应的bean对象
                .build();
        IService iService = retrofit.create(IService.class);
        Call<QSBean> call = iService.getBeanData("latest", 1);
        call.enqueue(new Callback<QSBean>() {
            @Override
            public void onResponse(Call<QSBean> call, Response<QSBean> response) {
                QSBean bean = response.body();
                mTvResult.setText(bean.getErr() + ":" + bean.getPage());
            }

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

            }
        });
    }

    private void queryMapData() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL)
                .build();
        IService iService = retrofit.create(IService.class);
        //limit=20&ad=2&gender=1&offset=0&generation=1
        Map<String, String> params = new HashMap<>();
        params.put("limit", "20");
        params.put("ad", "2");
        params.put("gender", "1");
        params.put("offset", "0");
        params.put("generation", "1");
        Call<ResponseBody> call = iService.getQueryData(params);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                ResponseBody responseBody = response.body();
                try {
                    String reslut = responseBody.string();
                    mTvResult.setText(reslut);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }

}

PostActivity

public class PostActivity extends AppCompatActivity {

    @BindView(R.id.btn_field)
    Button mBtnField;
    @BindView(R.id.btn_field_map)
    Button mBtnFieldMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.btn_field, R.id.btn_field_map})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_field:
                postField();
                break;
            case R.id.btn_field_map:
                postFieldMap();
                break;
        }
    }

    private void postField() {
        ////`platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL_GIFT)
                .build();
        IService iService = retrofit.create(IService.class);
        Call<ResponseBody> call = iService.postField(2, 1, "60841c5b7c69a1bbb3f06536ed685a48");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String result = response.body().string();
                    System.out.println(result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }

    private void postFieldMap(){
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL_GIFT)
                .build();
        IService iService = retrofit.create(IService.class);
        Map<String,String> params=new HashMap<>();
        params.put("platform","2");
        params.put("gifttype","1");
        params.put("compare","60841c5b7c69a1bbb3f06536ed685a48");
        Call<ResponseBody> call = iService.postFieldMap(params);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String result = response.body().string();
                    System.out.println(result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }
}
发布了34 篇原创文章 · 获赞 3 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/The_king_of_Asia/article/details/55215525
今日推荐