Retrofit用法(一)快速入门

刚学了Retrofit的使用,这里做个总结,一方面相当于做个笔记,另一个方面也方便感兴趣的新手能快速学习。

这里我自己写了个最简单的demo,后期我会增加更多的例子。
先看下工程目录:

这里贴下代码,后面慢慢解释
ApiService.java

public interface ApiService {
    @GET("sk/paylist.json")
    Call<News> getNews(@Query("platform")String platform,@Query("channel") String channel);
}

MainActivity.java


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private Button bt;
    private String BaseUrl = "http://10.10.6.195:8080/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = (Button) findViewById(R.id.bt);
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BaseUrl)
                .build();
        final ApiService mApi = retrofit.create(ApiService.class);



        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Call<News> news = mApi.getNews("android", "100");
                news.enqueue(new Callback<News>() {
                    @Override
                    public void onResponse(Call<News> call, Response<News> response) {
                        News s = response.body();
                        Log.d(TAG,s.getData().get(0).getName()+s.getData().get(0).getPrice());
                    }

                    @Override
                    public void onFailure(Call<News> call, Throwable t) {
                        Log.d(TAG+"4",t.toString());
                    }
                });
            }
        });




    }
}

News.java

package com.a4kgarden.mytest;

import java.util.List;

/** * Created by HY on 2017/2/28. */

public class News {

    /** * errMsg : * errCode : 0 * data : [{"time":"2016-11-08 18:18:29","price":"0.01","name":"包月黄金会员"},{"time":"2016-11-08 18:18:32","price":"0.01","name":"包月黄金会员"},{"time":"2016-11-08 18:18:36","price":"0.01","name":"包月黄金会员"}] * version : 1.0.0 */

    private String errMsg;
    private String errCode;
    private String version;
    private List<DataBean> data;

    public String getErrMsg() {
        return errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

    public String getErrCode() {
        return errCode;
    }

    public void setErrCode(String errCode) {
        this.errCode = errCode;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /** * time : 2016-11-08 18:18:29 * price : 0.01 * name : 包月黄金会员 */

        private String time;
        private String price;
        private String name;

        public String getTime() {
            return time;
        }

        public void setTime(String time) {
            this.time = time;
        }

        public String getPrice() {
            return price;
        }

        public void setPrice(String price) {
            this.price = price;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

这里看下发送Get请求的步骤

开始之前先添加项目所需要的依赖库

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

1.新建一个请求接口类,你可以在这个类里定义每一个请求,上面的ApiService.java里只定义了一个Get请求,为了调试方便,我本地取了一个paylist.json文件,放到tomcat里,模拟了网络访问此接口,你可以根据需要配置自己的json文件。

@GET("sk/paylist.json")//引号里的内容会追加到URL后,我已在MainActivity里定义为BaseUrl Call<News> getNews(@Query("platform")String platform,@Query("channel") String channel);
   /* @query是匹配get请求Url中?后面的字段的,这个demo里有两个字段,最终显示结果为http://10.10.6.195:8080/sk/paylist.json?platform=android&channel=XIAOMI */
demo里因为请求的是本地服务器里模拟的json文件,有没有参数效果是一样的,真实开发中要注意别写错。

2.建立javabean文件,用于封装返回的数据实体
现在都用studio开发了,这里推荐用studio的插件gsonformat,在插件库里可以下载,可以一键生成bean文件不需要手动建立,简单高效。
3.编写请求的代码,套路的一种,此外还有很多写法,后期再说。这里只是最简单的demo,但可以满足日常开发了

Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BaseUrl)
                .build();

        final ApiService mApi = retrofit.create(ApiService.class);
        Call<News> news = mApi.getNews("android", "100");
                news.enqueue(new Callback<News>() {
                    @Override
                    public void onResponse(Call<News> call, Response<News> response) {
                        News s = response.body();//注意这里,一行代码将返回结果完成封装,非常给力
                        Log.d(TAG,s.getData().get(0).getName()+s.getData().get(0).getPrice());
                    }

                    @Override
                    public void onFailure(Call<News> call, Throwable t) {
                        Log.d(TAG+"4",t.toString());
                    }
                });

发送一个Post请求

这里在ApiService里添加此方法,@Feild为Post请求添加请求参数,对应每一个Key-value,需要加@FormUrlEncoded注解。

 @FormUrlEncoded @POST("pay/order") Call<OrderBean> getOrderId(@Field("productId") String productId, @Field("contentId") String contentId, @Field("seriesCode") String seriesCode, @Field("spId") String spId, @Field("userId") String userId, @Field("price") String price );

发送请求的代码如下,只修改了很少部分的代码

 Call<OrderBean> order = mApi.getOrderId("10001","101","432","100","sdjgkdjlkgj","0.01");
                order.enqueue(new Callback<OrderBean>() {
                    @Override
                    public void onResponse(Call<OrderBean> call, Response<OrderBean> response) {
                        OrderBean s = response.body();
                        Log.d(TAG,s.getData());
                    }

                    @Override
                    public void onFailure(Call<OrderBean> call, Throwable t) {
                        Log.d(TAG+"4",t.toString());
                    }
                });

你可能感兴趣的:(retrofit)