Retrofit原理解析,带你更加直观了解Retrofit

Retrofit我们可以理解为是网络请求的一部分:

  1. 类似于我们之前用的HttpClient,HttpConnection,Okhttp等
  2. 但是它的请求的特点和上面的有些差别

首先看下效果图:
由于图片本身限制为2W,所以简单补充一下每个Button按钮所请求的差别

由于图片本身限制为2W,所以简单补充一下每个Button按钮所请求的(主要是请求网址的不同形式差别)差别

  1. 进行一个简单请求,没有参数等的变化,是一个完整的请求网络地址,我这里请求的是:http://www.baidu.com
  2. 第二个请求的类型:http://www.baidu.com/daily/view,这里的view是变量,所以该请求分为:基本url:http://www.baidu.com 和后缀url:daily/view
  3. 当我们的请求的网址类型为http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16 时候,也就是请求参数含有类似:key,date等变量请求参数时
  4. 当我们请求时我们的key,date可能不止一组,可能会有很多,所以我们有必要通过Map集合来进行管理参数
  5. Retrofit封装Get请求
  6. Retrofit封装Post请求

导入依赖包

  1. 第一个Retrofit基本包
  2. 指定我们请求数据转换成String所要导入的包
  3. RetrofitGson解析
 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta2'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

项目目录结构

这里写图片描述

  1. bean里面的Status是我们请求的网络结果生成的对象
  2. 接口类是我们Retrofit很显著的一个特点,ProjectAPI应用于封装,RequestApi处理我们的前四个按钮
  3. 管理类,也是我们的封装所需的类
  4. 我们的Activity

布局文件activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
   android:orientation="vertical"
    >

    <Button
        android:id="@+id/btn_requestBaidu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit请求百度首页" />

    <Button

        android:id="@+id/btn_baiduKnow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit请求百度知道" />
    <Button

        android:id="@+id/btn_getStatus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit-get请求Status" />
    <Button

        android:id="@+id/btn_postStatus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit-post请求Status" />
    <Button

        android:id="@+id/btn_getpackage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit封装get请求" />
    <Button

        android:id="@+id/btn_postpackage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit封装post请求" />
</LinearLayout>

这里写图片描述

RequestApi代码

public interface RequestAPI
{
    /*
    //http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16

    * get请求方式
    * */
    @GET
    Call<String> getBaidu(@Url String url);

    /*
    * https://zhidao.www.baidu.com/daily/view
    *
    * 基本的url是:https://zhidao.www.baidu.com ,我们需要对后面的实行拼接
    *
    * */
    //{v}代表所需要变化的path参数,比如id等,是变量
    //@Path("v") String v) 代表替换掉v,用String 后面的v代替,不全到daily后
    /*
    * 路径拼接的形式
    * */
    @GET("daily/{v}")
    Call<String> getBaiduKnow(@Path("v") String v);

    /*
    * http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16
    * */
    @GET("todayOnhistory/queryEvent.php")
    Call<Status> getStatus(@Query("key") String key,@Query("date") String date);

    @GET("todayOnhistory/queryEvent.php")
    Call<Status> getStatusMap(@QueryMap Map<String,String> map);

    @POST("todayOnhistory/queryEvent.php")
    Call<Status> postStatus(@Field("key")String key,@Field("date") String date);

    //postmap必须指定
    @FormUrlEncoded
    @POST("todayOnhistory/queryEvent.php")
    Call<Status> postStatusMap(@FieldMap Map<String,String> map);
}

MainActivity

“`
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button btnRequestBaidu,btnBaiduKnow,btnGetStatus,btnPostStatus,btngetPackage,btnpostPackage;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //控件初始化
    initView();

}

private void initView()
{
//请求百度首页按钮
    btnRequestBaidu= (Button) findViewById(R.id.btn_requestBaidu);
    btnRequestBaidu.setOnClickListener(this);

    //请求百度知道首页按钮
    btnBaiduKnow= (Button) findViewById(R.id.btn_baiduKnow);
    btnBaiduKnow.setOnClickListener(this);

    //Retrofit-get请求Status按钮
    btnGetStatus= (Button) findViewById(R.id.btn_getStatus);
    btnGetStatus.setOnClickListener(this);

    //Retrofit-post请求Status按钮
    btnPostStatus= (Button) findViewById(R.id.btn_postStatus);
    btnPostStatus.setOnClickListener(this);

    btngetPackage= (Button) findViewById(R.id.btn_getpackage);
    btngetPackage.setOnClickListener(this);

    btnpostPackage= (Button) findViewById(R.id.btn_postpackage);
    btnpostPackage.setOnClickListener(this);
}

@Override
public void onClick(View view)
{

    switch (view.getId())
    {
        case R.id.btn_requestBaidu:

            //先创建Retrofit对象 //设置Url     
            //addConverterFactory添加转换形式,ScalarsConverterFactory.create指定转换类型为String
            Retrofit retrofit=new Retrofit.Builder().baseUrl("http://www.baidu.com").addConverterFactory(ScalarsConverterFactory.create()).build();

            //将请求的API转成Java接口
            RequestAPI requestApi= retrofit.create(RequestAPI.class);

            //获取调用对象
            Call<String> baidu= requestApi.getBaidu("http://www.baidu.com");

            //拿到Call對象進行請求,分为同步与异步


            //同步请求必须放在子线程中,所以不是首选

// try {
// baidu.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }

            //使用异步请求
            baidu.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    //得到请求的http文本
                    Toast.makeText(MainActivity.this,response.body(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    //得到抛出的异常信息
                    Toast.makeText(MainActivity.this,t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });


            break;
        case R.id.btn_baiduKnow:

            //先创建Retrofit对象                              //设置Url                //添加转换形式       //指定转换类型为String
            Retrofit retrofit1=new Retrofit.Builder().baseUrl("http://www.baidu.com").addConverterFactory(ScalarsConverterFactory.create()).build();

            //将请求的API转成Java接口
            RequestAPI requestApi1= retrofit1.create(RequestAPI.class);

            //获取调用对象
            //view 指的是我们具体添加的path,替换掉接口中的v
            Call<String> know= requestApi1.getBaiduKnow("view");

            //拿到Call對象進行請求,分为同步与异步


            //同步请求必须放在子线程中,所以不是首选

// try {
// baidu.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }

            //使用异步请求
            know.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    //得到请求的http文本
                    Toast.makeText(MainActivity.this,response.body(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    //得到抛出的异常信息
                    Toast.makeText(MainActivity.this,t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });


            break;
        case R.id.btn_getStatus:
                Retrofit retrofit2=new Retrofit.Builder().baseUrl("http://v.juhe.cn/").addConverterFactory(GsonConverterFactory.create()).build();
                RequestAPI requestAPI=retrofit2.create(RequestAPI.class);
                Call<Status> status=requestAPI.getStatus("69a7eeba7869f8bdcdee7b2bc3bb5aa2","1/16");
                status.enqueue(new Callback<Status>() {
                    @Override
                    public void onResponse(Call<Status> call, Response<Status> response)
                    {
                        Status status1=response.body();
                        Toast.makeText(MainActivity.this, status1.getResult().get(3).getTitle(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(Call<Status> call, Throwable t)
                    {
                        Toast.makeText(MainActivity.this, "dsfefsdf", Toast.LENGTH_SHORT).show();
                    }
                });



            break;
        case R.id.btn_postStatus:
            Retrofit retrofit3=new Retrofit.Builder().baseUrl("http://v.juhe.cn/").addConverterFactory(GsonConverterFactory.create()).build();
            RequestAPI requestAPI4=retrofit3.create(RequestAPI.class);

            Map<String,String> map=new HashMap<String,String>();
            map.put("key","69a7eeba7869f8bdcdee7b2bc3bb5aa2");
            map.put("date","1/17");

            Call<Status> statusCall=requestAPI4.postStatusMap(map);
            statusCall.enqueue(new Callback<Status>() {
                @Override
                public void onResponse(Call<Status> call, Response<Status> response) {
                    Status status1=response.body();
                    Toast.makeText(MainActivity.this, status1.getResult().get(4).getTitle(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<Status> call, Throwable t) {
                    Toast.makeText(MainActivity.this, "dsfefsdf", Toast.LENGTH_SHORT).show();
                }
            });

            break;
        case R.id.btn_getpackage:

            HttpManager.getMethod("http://v.juhe.cn/", "http://v.juhe.cn/todayOnhistory/queryEvent.php?key=69a7eeba7869f8bdcdee7b2bc3bb5aa2&date=1/16", new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    Toast.makeText(MainActivity.this, response.body(), Toast.LENGTH_SHORT).show();
                }

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

                }
            });
            break;
        case R.id.btn_postpackage:

            Map<String,String> map1=new HashMap<String,String>();
            map1.put("key","69a7eeba7869f8bdcdee7b2bc3bb5aa2");
            map1.put("date","1/15");

            HttpManager.postMethod("http://v.juhe.cn/", "todayOnhistory/queryEvent.php", map1, new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    Toast.makeText(MainActivity.this, response.body(), Toast.LENGTH_SHORT).show();
                }

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

                }
            });
            break;
        default:
            break;
    }

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值