这篇教程基于retrofit1.9版本和android平台.
以下部分代码和教程参考自http://square.github.io/retrofit/
准备:
retrofit的下载地址:https://github.com/square/retrofit
如果采用引入jar包的方式的话,也额外引入retrofit的依赖jar包.
因为retrofit1.9版本不再支持android原生的URLConnection和HttpClient框架.所以必须要引入okHttp2.0框架进行网络访问.
下面2个是必要的jar包
okhttp-2.2.0.jar
okio-1.0.2.jar(okhttp的依赖jar包)
下面的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
|
interface
SimpleGET{
@GET
(
"/"
)
//表明是GET方式. "/"会拼接在setEndpoint(url)中url(主机地址)的后面.
Response getResponse();
//可以简单的理解为网络访问完把Response转换为一个对象.这里没有转换,还是Response.
}
|
访问,注意在Android上要在异步线程执行下面语句.
1
2
3
4
5
6
7
8
9
10
|
RestAdapter adapter=
new
RestAdapter.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
|
interface
SimplePOST{
@POST
(
"/android"
)
//表明是使用Post方式进行访问. 并且会把后面的路径拼接到主机名的后面-->拼接到setEndpoint(url)中的url的后面.
Response getResponse();
}
|
异步线程中执行下面语句.
1
2
3
4
5
6
7
8
9
10
|
RestAdapter adapter=
new
RestAdapter.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();
}
|
PATH
path是可以动态替换的.
1
2
3
|
interface
GitHub {
@GET
(
"/repos/{owner}/{repo}/contributors"
)
List<Contributor> contributors(
@Path
(
"owner"
) String owner,
@Path
(
"repo"
) String repo);
|
网络访问部分
1
2
3
4
|
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;
int
contributions;
}
interface
GitHub {
@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
public
Object fromBody(TypedInput input, Type type)
throws
ConversionException {
//response输入流到对象的转换,
try
{
InputStream in = input.in();
//获取了输入流,就可以根据意愿随意转换了.
String str = convertStream2String(in);
return
str;
}
catch
(IOException e) {
e.printStackTrace();
}
return
null
;
}
private
String convertStream2String(InputStream in)
throws
IOException {
//inputStream转换为String
BufferedReader reader=
new
BufferedReader(
new
InputStreamReader(in));
StringBuilder sb=
new
StringBuilder();
String line=
null
;
while
((line=reader.readLine())!=
null
){
sb.append(line);
sb.append(
"\n"
);
}
return
sb.toString();
}
@Override
public
TypedOutput toBody(Object obj) {
//对象到输出流的转换
return
null
;
}
}
|
1
2
3
4
|
interface
StringClient {
@GET
(
"/"
)
String getString();
//方法的返回值是String,需要StringConverter转换器Converter把Response转换为String.
}
|
异步线程调用
1
2
3
4
5
|
RestAdapter adapter=
new
RestAdapter.Builder().setEndpoint(url).setConverter(
new
StringConverter()).build();
StringClient create = adapter.create(StringClient.
class
);
String str = create.getString();
|