昨天因为接口改动的事情,一激动跟老大说话提高到了最大分贝。现在想想真是对不起老大。记得上次他问我以前用过什么网络框架,我说retrofit。正好小伙伴不是很了解,我也快忘记怎么用了,今天整理出来,方便日后用到。
Retrofit使用步骤:
1.定义一个接口。用来封装URL地址和数据请求
2.实例化retrofit
3.调用retrofit实例创建接口和服务对象
4.接口服务对象调用接口中的方法获取call对象
5.call对象执行请求
我首先定义了一个常量类用来存放BASE_URL。紧接着定义了一个INewsBiz接口
public class Constant {
//一个完整的url地址
public final static String URL="http://litchiapi.jstv.com/" +
"api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41";
//上边URL的根路径
public final static String BASE_URL="http://litchiapi.jstv.com/";
//完整路径: http://42.120.4.67/api/app/business/category?app_id=161
public final static String TEABASE_URL="http://42.120.4.67/api/app/business/";
//下载图片地址
public final static String IMAGE_URL="http://img5.imgtn.bdimg.com/it/u=4080105893,4096129906&fm=206&gp=0.jpg/";
//登录地址 http://10.0.152.244:8080/WebServiceDemo/LoginServlet
public final static String LOGIN_URL="http://10.0.152.244:8080/WebServiceDemo/";
public final static String UPLOAD_URL="http://192.168.1.103:8080/UploadServer/";
}
public interface INewsBiz {
/*
通过@GET注解标示为get请求 @GET中填写的value和baseUrl指定的地址组成完成的访问路径
baseUrl构造retrofit对象时指定
*/
@GET("api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
Call getResonsebody();
@GET("api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
Call getJsonString();
@GET("category?app_id=161")
Call> getTeas();
@GET("api/{type}?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
Call getNewsInfo(@Path("type") String type);//String type="GetFeeds"
//http://42.120.4.67/api/app/business/category?app_id=161
@GET("category")
Call> getTeaByNetWork(@Query("app_id") int id);//int id=161
//api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
@GET("api/GetFeeds")
Call getInfo(@QueryMap Map map);
// @GET("api/{type}")
// Call getInfo(@Path("type") String type,@QueryMap Map map);
//网络上下载文件
@GET("download")
Call downLoad();
//post请求中通过@FormUrlEncoded和@POST注解 指明访问的地址 @Field("向服务器提交的key")
@POST("LoginServlet")//采用post请求方式
@FormUrlEncoded //表单提交
Call login(@Field("username") String username,
@Field("password") String password);
}
普通额get请求,对应接口中的getResponseBody()方法
/**
* 普通get请求,返回ResponseBody
*/
public void initRetrofit01(){
//构建Retrofit网络访问对象
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.BASE_URL)//设置访问的跟路径
.build();
//根据接口的字节码文件对象获取接口的对象
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
//调用接口中定义的函数
Call call=iNewsBiz.getResonsebody();
/*enqueue 采用异步访问数据 execute()采用同步访问数据*/
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if(response.isSuccessful()){//成功的获取响应
try {
String result=response.body().string();//获取网络访问的字符串
tv.setText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
/**
* 采用同步访问的方式 excute()
*/
public void initRetrofit08(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.BASE_URL)
.build();
final INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
new Thread(new Runnable() {
@Override
public void run() {
try {
Call call=iNewsBiz.getResonsebody();
// 采用同步方式请求数据
Response response=call.execute();
final String str=response.body().string();
tv.post(new Runnable() {
@Override
public void run() {
tv.setText(str);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 普通get请求 返回的数据为String类型
*/
public void initRetrofit02(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.BASE_URL)
//设置回调时的适配器 get请求后可以返回String字符串类型的内容
.addConverterFactory(ScalarsConverterFactory.create())
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
Call call=iNewsBiz.getJsonString();
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if(response.isSuccessful()){
tv.setText(response.body());
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
/**
* 普通的get请求 返回的数据为gson解析后的list集合
*/
public void initRetrofit03(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.TEABASE_URL)
//如果服务器返回的时json格式数据 设置了GsonConverterFactory
//实现对对象的转化
// 自定义数据解析器 只要解析器继承Converter.Factory即可
.addConverterFactory(GsonConverterFactory.create())
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
Call> call=iNewsBiz.getTeas();
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
if(response.isSuccessful()){
List list=response.body();//获取解析后的集合
StringBuilder sb=new StringBuilder();
for(Tea t:list){
sb.append(t.getProduct_cat_name());
}
tv.setText(sb.toString());
}
}
@Override
public void onFailure(Call> call, Throwable t) {
}
});
}
以上都为普通的get请求,区别仅在于同步异步,及因为配置的解析器不同,所得到的数据类型不同。
通过占位符指定path路径,在得到call对象时,通过调用接口中的方法,获取占位符所需要的变量。
/**
* get请求 通过占位符指定path路径
*/
public void initRetrofit04(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
Call call=iNewsBiz.getNewsInfo("GetFeeds");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if(response.isSuccessful()){
List.ParamzBean.FeedsBean> news=
response.body().getParamz().getFeeds();
StringBuilder sb=new StringBuilder();
for(NewsInfo.ParamzBean.FeedsBean feed:news){
sb.append(feed.getData().getSubject());
}
tv.setText(sb.toString());
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
@query与@QueryMap将参数以key-value对的形式使用
/**
get请求 通过@query注解动态传递参数的值
*/
public void initRetrofit05(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.TEABASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
Call> call=iNewsBiz.getTeaByNetWork(161);
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
if(response.isSuccessful()){
StringBuilder sb=new StringBuilder();
List list=response.body();
for(Tea t:list){
sb.append(t.getProduct_cat_name());
}
tv.setText(sb.toString());
}
}
@Override
public void onFailure(Call> call, Throwable t) {
}
});
}
/**
* get 请求通过@queryMap注解动态传递多个参数
*/
public void initRetrofit06(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
//column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
//将参数根据key-value对的形式存储到map集合中
Map map=new HashMap<>();
map.put("column",0+"");
map.put("PageSize",20+"");
map.put("pageIndex",1+"");
map.put("val","100511D3BE5301280E0992C73A9DEC41");
Call call=iNewsBiz.getInfo(map);
//api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
// Call call=iNewsBiz.getInfo("GetFeeds",map);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if(response.isSuccessful()){
List.ParamzBean.FeedsBean> news=
response.body().getParamz().getFeeds();
StringBuilder sb=new StringBuilder();
for(NewsInfo.ParamzBean.FeedsBean feed:news){
sb.append(feed.getData().getSubject());
}
tv.setText(sb.toString());
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
/**
* 下载网络图片文件
*/
public void initRetrofit07(){
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(Constant.IMAGE_URL)
.build();
INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
Call call=iNewsBiz.downLoad();
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if(response.isSuccessful()){
// String str=response.body().string();
// byte[] buff=response.body().bytes();
InputStream inputStream=response.body().byteStream();
Bitmap bm= BitmapFactory.decodeStream(inputStream);
iv.setImageBitmap(bm);
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
其实还有一个很重要的利用retrofit提交json格式数据
1.先定义一个实体类
2.需要添加头
@Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头
@POST("api/FlyRoute/Add")
Call postTeaRoute(@Body RequestBody route);//传入的参数为RequestBody
3.转换
PostRoute postRoute=retrofit.create(PostRoute.class);
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);
Call call=postRoute.postFlyRoute(body);
除了这些与get请求不同之外,其它都没有什么差别。
对于post请求上传json格式,可以参照博客:
http://blog.csdn.net/zhupumao/article/details/51628698
好啦,整理完毕,以后可以欢快的用了。整理完用法,下次该回忆回忆注解是个什么鬼了。我这还不如金鱼七秒钟的记忆呀。