刚学了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());
}
});