天天看點

Retrofit2.0+網絡架構HTTP實戰

上文介紹了搭建本地服務端,Android用戶端是進行普通的HTTP請求,今天我基于此servlet,繼續介紹一種新的網絡請求方式,就是目前比較流行的一種架構:Retrofit。Retrofit是一款面向Android和Java的類型安全的HTTP用戶端架構,簡單友善。可以通過注解的方式,申明請求的方式和參數。它很強大,支援GET, POST, PUT, DELETE, and HEAD.等請求。

一,Retrofit的特點

1,支援URL參數的替換和請求參數查詢

2,Object類型轉換為請求體,如JSON,buffers

3,支援Multipart,大檔案上傳。

下面舉例來介紹。

二,服務端搭建,提供通路的接口

上文我已經搭建來一個簡單的servlet接口,用戶端通路時傳username參數,server會傳回json字元串。詳情請看:

搭建本地server,響應Android用戶端HTTP請求

三,使用傳統的HTTP請求方式通路接口

之前我們通常會使用第三方架構,比如使用OKHTTP,我另外有介紹: Android網絡請求:OkHttp實戰

或者像我這樣自己封裝請求:

//測試本地servlet接口,可以get,也可以post
public static void testMyServlet(){
        String baseUrl="http://192.168.1.103:8080/Android/";
        String url = baseUrl+"servlet/LoginServlet";
        String url2 = baseUrl+"servlet/LoginServlet?username=duqian223";
//OairHttpHelper.sendPost(OairHttpHelper.Method_Get, url2, null, new OairHttpHelper.OairHttpListener() {
        OairHttpHelper.sendPost("POST", url, "username=dusan2016&age=25", new OairHttpHelper.OairHttpListener() {
            @Override
            public void onSuccess(String result) {
                LogUtils.debug(TAG,"MyServlet result="+result);
            }
            @Override
            public void onFailure(Exception e) {           LogUtils.debug(TAG,"error="+e.toString());
            }
        });
    }
           

封裝的内部實作不用說了吧,就是HTTPURLConnection請求。傳回結果一個簡單的json:

{"username":"dusan2016"}
           

三,使用Retrofit進行HTTP請求

1,首先,定義API服務接口

注解的形式聲明GET和POST請求,login是方法名,後面不帶參數的為GET請求,參數寫在URL中,有參數的寫在方法裡面,通過Query形式。Call是範型,傳回請求後得到的javaBean對象,本文為TestBean,代碼如下:

/**
 * 封裝json為TestBean
 * Created by duqian on 16/5/3.
 */
public class TestBean {
    public String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "TestBean{" +
                "username='" + username + '\'' +
                '}';
    }
}
           

使用Retrofit進行HTTP請求的定義

/**
 * retrofit for HTTP
 * Created by duqian on 16/5/3.
 */
public interface OairApiService {
    @POST("servlet/LoginServlet")
    Call<TestBean> login(@Query("username") String username);
    @GET("servlet/LoginServlet?name=duqian2016")
    Call<TestBean> login();
}
           

2,實作API服務接口OairApiService

public static void testRetrofit() {
        baseUrl = "http://192.168.1.103:8080/Android/";//根URL
        //建立Retrofit執行個體,實作OairApiService接口
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)       .addConverterFactory(GsonConverterFactory.create())
                .build();
        OairApiService oairAPIService = retrofit.create(OairApiService.class);
        //發送Post請求,不帶參數為GET請求
        final Call<TestBean> call = oairAPIService.login("Dusan2016");
        call.enqueue(new Callback<TestBean>() {
            @Override
            public void onResponse(Call<TestBean> call, Response<TestBean> response) {
                String result = response.body().toString();
                LogUtils.debug(TAG,"result="+result);
            }

            @Override
            public void onFailure(Call<TestBean> call, Throwable t) {
                LogUtils.debug(TAG,"error "+t.toString());
            }
        });
}
           

測試通過,傳回結果如下:

result=TestBean{username='Dusan2016'}
           

3,Android studio依賴

//android studio開發,請添加最新的retrofit,本例通過Gson解析json,添加對應的依賴:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
           

四,retrofit其他請求方式

官方提供了很多請求方式的說明。get請求,可以在URL中修改參數,在實際請求的時候,傳入參數動态修改URL。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
           

另外,還可以添加查詢的參數

//簡單的參數
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
//複雜的參數寫法,用map集合
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
           

表單送出是常見的請求方式,聲明為form表單送出,可以這樣寫:

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
           

檔案上傳同樣支援,通過注解的方式,添加請求體和表述文字:

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
           

如果要添加請求頭,我們可以用注解的方式@Headers:

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
//或者這樣動态的添加Header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
           

五,總結

本文隻是以一個簡單的demo為例,介紹了retrofit的基本使用,并解釋了官方的一些用法。是不是瞬間覺得,簡單大氣上檔次。其實,真實項目中使用,會發現它的确很強大,很多實用的功能,内部實作原理也很有意思。

未完待續,杜乾,Dusan,Q 291902259,歡迎交流。