这篇教程基于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方式
interface SimpleGET{ @GET("/") //表明是GET方式. "/"会拼接在setEndpoint(url)中url(主机地址)的后面. Response getResponse(); //可以简单的理解为网络访问完把Response转换为一个对象.这里没有转换,还是Response. }
访问,注意Android上要在子线程执行下面语句.(后面会讲到retrofit的CallBack方式,那种异步的retrofit不用在子线程执行)
String url="http://tieba.baidu.com"; 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方式
interface SimplePOST{ @POST("/android") //表明是使用Post方式进行访问. 并且会把后面的路径拼接到主机名的后面-->拼接到setEndpoint(url)中的url的后面. Response getResponse(); }
异步线程中执行下面语句.
String url="http://tieba.baidu.com"; 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(); }
特别注意,不管是GET还是POST注解,其后面跟的字符串必须以"/"开头,且不能是字符串.(原因看后面的retrofit的原理解析.)
PATH
path是可以动态替换的.
interface GitHub { @GET("/repos/{owner}/{repo}/contributors") //实现原理是通过正则表达式进行替换. List<Contributor> contributors(@Path("owner") String owner, @Path("repo") String repo);
网络访问部分
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包
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); }
网络访问部分.
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转换器
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; } }
interface StringClient { @GET("/") String getString(); //方法的返回值是String,需要StringConverter转换器Converter把Response转换为String. }
子线程中运行下面代码.
String url="http://tieba.baidu.com"; RestAdapter adapter=new RestAdapter.Builder().setEndpoint(url).setConverter(new StringConverter()).build(); StringClient create = adapter.create(StringClient.class); String str = create.getString();