Retrofit的使用教程(一) 1.9

来源:互联网 发布:淘宝开店货源免费代理 编辑:程序博客网 时间:2024/06/15 14:18

转自:http://www.cnblogs.com/laiqurufeng/p/4483658.html


这篇教程基于retrofit1.9版本和android平台.
以下部分代码和教程参考自http://square.github.io/retrofit/
准备:
retrofit的下载地址:https://github.com/square/retrofit
如果采用引入jar包的方式的话,也额外引入retrofit的依赖jar包.
因为retrofit1.9版本虽然支持android原生的URLConnection和HttpClient框架.但推荐使用okHttp2.0框架进行网络访问.
比如:okhttp-2.2.0.jar(最好okhttp为2.1版本以上)
   okio-1.0.2.jar(okhttp的依赖jar包)
retrofit会自动判断,如果使用了okhttp的jar包,会优先使用okhttp,如果没有的话, 在android平台上会判断SDk版本,如果2.3以前的版本会自动使用httpClient,以后的版本会使用UrlConnection.
 
下面的jar是功能增强的jar包.根据要使用的功能再去引入.
gson-2.3.jar
appengine-api-1.0-sdk-1.9.12.jar
rxjava-1.0.0.jar
以上jar包可以在github或者maven中央仓库下载到.注意jar包的版本.
GET方式
1
2
3
4
interfaceSimpleGET{
  @GET("/")//表明是GET方式. "/"会拼接在setEndpoint(url)中url(主机地址)的后面.
  Response getResponse();//可以简单的理解为网络访问完把Response转换为一个对象.这里没有转换,还是Response.
} 
访问,注意Android上要在子线程执行下面语句.(后面会讲到retrofit的CallBack方式,那种异步的retrofit不用在子线程执行)
1
2
3
4
5
6
7
8
9
10
String url="http://tieba.baidu.com";
RestAdapter adapter=newRestAdapter.Builder().setEndpoint(url).build(); //setEndpoint(url)设置网络访问地址的主机地址
SimpleGET create = adapter.create(SimpleGET.class);//retrofit会生成上面的SimpleGET接口的一个的实例.
Response response = create.getResponse();
int status = response.getStatus(); //返回码
try {
  InputStream in = response.getBody().in();//response的输入流.看到网络访问的输入流都很熟悉吧.想转换成字符串还是json还是图片就看服务器给的是什么了.
} catch(IOException e) {
  e.printStackTrace();
}

  

POST方式
1
2
3
4
interfaceSimplePOST{
  @POST("/android")//表明是使用Post方式进行访问. 并且会把后面的路径拼接到主机名的后面-->拼接到setEndpoint(url)中的url的后面.
  Response getResponse();
} 
异步线程中执行下面语句.
1
2
3
4
5
6
7
8
9
10
String url="http://tieba.baidu.com";
RestAdapter adapter=newRestAdapter.Builder().setEndpoint(url).build(); //和上面post后面的路径拼接,想当于访问http://tieba.baidu.com/android
SimplePOST create = adapter.create(SimplePOST.class);
Response response = create.getResponse();
int status = response.getStatus();
try {
  InputStream in = response.getBody().in();
} catch(IOException e) {
  e.printStackTrace();
} 
 
特别注意,不管是GET还是POST注解,其后面跟的字符串必须以"/"开头,且不能是字符串.(原因看后面的retrofit的原理解析.)
 
PATH
path是可以动态替换的.
1
2
3
interfaceGitHub {
  @GET("/repos/{owner}/{repo}/contributors")                   //实现原理是通过正则表达式进行替换.
  List<Contributor> contributors(@Path("owner") String owner,@Path("repo") String repo);
网络访问部分
1
2
3
4
private static final String API_URL ="https://api.github.com";
RestAdapter restAdapter =new RestAdapter.Builder().setEndpoint(API_URL).build();
GitHub github = restAdapter.create(GitHub.class);
List<Contributor> contributors = github.contributors("square","retrofit"); //相当于对路径中{}部分进行动态替换. 相当于访问https://api.github.com/repos/square/retrofit/contributors 

  

GsonConverter默认的转换器
看了上面这一些,可以回想retrofit也没方便多少啊.下面看一个例子就可以知道retrofit的魅力所在了.
注意需要引入gson的jar包
1
2
3
4
5
6
7
8
9
static class Contributor { //一个pojo类(Plain Ordinary Java Object)简单的Java对象-->相比javaBean更简单.
  String login;
  intcontributions;
}
  
interfaceGitHub {
  @GET("/repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Path("owner") String owner,@Path("repo") String repo);
} 
网络访问部分.
1
2
3
4
5
6
7
RestAdapter restAdapter =new RestAdapter.Builder().setEndpoint(API_URL).build();//默认设置了GsonConverter的转换器.把response直接解析为一个POJO对象.
GitHub github = restAdapter.create(GitHub.class);
//访问这个地址返回的是一个JsonArray,JsonArray的每一个元素都有login和contributions这2个key和其对应的value.提取出来封装进POJO对象中.
List<Contributor> contributors = github.contributors("square","retrofit"); 
for (Contributor contributor : contributors) {
    Log.v("retrofit", contributor.login +" (" + contributor.contributions +")");
}
打印的结果:
JakeWharton (487)
pforhan (48)
edenman (40)
..........
直接方法https://api.github.com/repos/square/retrofit/contributors得到的数如下的json串.
[
{      
"login": "JakeWharton",
"id": 66577,
............
"site_admin": false,
"contributions": 487
},
{
"login": "pforhan",
.............
"site_admin": false,
"contributions": 48
},
{
"login": "edenman",
"................
"site_admin": false,
"contributions": 40
},
...........
]
可以看到retrofit的魅力所在了
 
 
自定义的Converter(StringConverter)
Response可以获得输入流,我们可以把它转换成任何想要的格式.
自定义的StringConverter转换器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class StringConverter implements Converter{
  
  @Override
  publicObject fromBody(TypedInput input, Type type) throwsConversionException { //response输入流到对象的转换,
  try{
    InputStream in = input.in();//获取了输入流,就可以根据意愿随意转换了.
    String str = convertStream2String(in);
    returnstr;
  } catch(IOException e) {
    e.printStackTrace();
  }
  
  returnnull;
  }
  
privateString convertStream2String(InputStream in) throwsIOException { //inputStream转换为String
  BufferedReader reader=newBufferedReader(newInputStreamReader(in));
  StringBuilder sb=newStringBuilder();
  String line=null;
  while((line=reader.readLine())!=null){
    sb.append(line);
    sb.append("\n");
  }
  returnsb.toString();
}
@Override
public TypedOutput toBody(Object obj) { //对象到输出流的转换
  returnnull;
 }
  
}
1
2
3
4
interfaceStringClient {
  @GET("/")
  String getString();//方法的返回值是String,需要StringConverter转换器Converter把Response转换为String.
} 
子线程中运行下面代码.
1
2
3
4
5
String url="http://tieba.baidu.com";
RestAdapter adapter=newRestAdapter.Builder().setEndpoint(url).setConverter(newStringConverter()).build();
StringClient create = adapter.create(StringClient.class);
String str = create.getString();

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 朋友总是以隐私为借口欺骗我怎么办 三星手机版本低下载不了微信怎么办 选了动漫制作技术但不会画画怎么办 做主播高薪可是心累不愿做了怎么办 pr导出的avi无压缩太大怎么办 捡了个小米max被绑定了怎么办 二十岁时头发开始掉了怎么办 在酒店换衣服忘记关窗帘了怎么办 淘宝店铺装修更改图片要收费怎么办 惠阳市教育考试考证号忘记怎么办 高考完被被骗去读自考以后怎么办 孩子学习遇到瓶颈期了老师该怎么办 微信家长群有不好的言论出现怎么办 铃木汽车后备箱电动锁没有电怎么办 坐飞机没有连号座位带孩子怎么办 白沙的衣服洗衣服时染上颜色怎么办 网购商家少发了货怎么办 我想成为安利的员工怎么办会员 安利皇后锅锅盖吸在桌子上怎么办 淘宝客服退款返佣金诈骗后怎么办 第一试用网的钱提现出现问题怎么办 一个手机号注册两个京东账号怎么办 白色衣服被洗衣粉泡白了怎么办 白色衣服染成一块块荧光色了怎么办 中脉远红镇痛护腰不会发热了怎么办 用完悦诗风吟脸变黑不均匀怎么办 护肤品开封后一年还没用完怎么办 兰蔻化妆品套装正品和假怎么办 月经期间卫生巾搞得屁股疼怎么办 大姨妈特别多用卫生巾老是漏怎么办 夏天用卫生巾不透气摩擦红了怎么办 在日本的洗手间用完的姨妈巾怎么办 想穿短裙但是膝盖怕凉怎么办 裤子被卫生巾粘住扯不下来怎么办 医生说来姨妈不可以用卫生巾怎么办 隆胸以后摸起来感觉假体会动怎么办 产后15个月说恶露没排干净怎么办 母猪产后两天肚子里还有小猪怎么办 背心式无痕运动文胸显得胸小怎么办 卫生巾过敏起疙瘩反复挠不好怎么办 去健身房办卡老板跑了怎么办