使用Retrofit進行網絡請求

環境要求

  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章