环境要求
Android 2.3及以上版本
Java 6及以上版本
配置
GRADLE配置文件下添加引用
dependencies { ... compile 'com.squareup.retrofit:retrofit:1.9.0' ... }
当OkHttp存在时,Retrofit会使用OkHttp来进行网络请求,使用OkHttp的添加引用如下
dependencies { ... compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' compile 'com.squareup.okhttp:okhttp:2.0.0' ... }
发起请求
下面的例子是使用Retrofit进行一次简单的异步GET请求,返回的值为String类型
首先定义一个接口,在接口中声明一个方法来定义请求的相关内容
interface User { @GET("/user/list.json") void getUsers(@Query("pagesize") int pagesize, Callback<String> callback); }
@GET表明该请求为GET方式,除此之外还有@POST, @PUT, @DELETE, 和@HEAD,具体的作用请参考官方文档,由于篇幅原因,这里不再叙述。
@Query为参数声明
Callback< String > 为回调接口,String表明返回数据结果就为String类型
然后创建一个RestAdapter对象,代码如下
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(CTX).setConverter(new BaseConverter()) .build();
setEndpoint方法指定了请求地址的前半部分,即服务器地址,如 https://api.github.com
setConverter方法需要一个转换接口的实现类作为参数,该类的作用是将请求得到的InputStream转换为想要的类型,示例代码如下
public class BaseConverter implements Converter { @Override public Object fromBody(TypedInput body, Type type) throws ConversionException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i = -1; String response = ""; try { while ((i = body.in().read()) != -1) { baos.write(i); } response = baos.toString(); baos.close(); } catch (IOException e) { e.printStackTrace(); } return response; } @Override public TypedOutput toBody(final Object object) { return new TypedOutput() { @Override public String fileName() { return null; } @Override public String mimeType() { return "String"; } @Override public long length() { return object == null ? 0 : object.toString().length(); } @Override public void writeTo(OutputStream out) throws IOException { out.write(object.toString().getBytes()); } }; } }
当得到了一个restAdapter 对象后,调用restAdapter的create方法得到User接口的实现类
Callback<String> callback = new Callback<String>() { @Override public void success(String s, Response response) { } @Override public void failure(RetrofitError error) { } } User user = getAdapter().create(User.class); //指定请求参数和回调接口的实现类 user.getUsers(12,callback);
Retrofit的强大之处就在于此,它会给根据接口的方法注解来实现该接口
代码混淆
如果需要进行代码混淆,配置如下
-dontwarn retrofit.** -keep class retrofit.** { *; } -keepattributes Signature -keepattributes Exceptions