環境要求
- 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的強大之處就在於此,它會給根據接口的方法註解來實現該接口
公共參數
對於有需要統一進行公共參數添加的網絡請求,可以使用下面的代碼來實現
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ctx).setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addQueryParam("publicParams", "1");
}
}).setConverter(new BaseConverter())
.build();
- 在RestAdapter的實例化對象的時候,爲其指定一個RequestInterceptor接口的實現類即可,在該類中,可以對請求體的相關參數進行設置,如addHeader、addQueryParam等
代碼混淆
如果需要進行代碼混淆,配置如下
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions