Retrofit2網絡框架的使用(一)

Retrofit是Square公司研究開發的網絡請求框架,它是基於okhttp實現的。廢話不多說,現在就介紹下retrofit的使用方法。
首先呢,它是一個第三方庫,我們需要導入它的依賴庫,即在我們gradle文件下的dependencies中導入我們的依賴庫,如下所示:

    //Retrofit網絡請求框架
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

由於現在的項目中都有圖片的展示,下面我需要引用到的依賴庫依然還是Square公司推出的picasso這個圖片下載和緩存的第三方庫:

compile 'com.squareup.picasso:picasso:2.3.2'

準備工作做完了,下面開始我們今天的主題,它的使用方法。
首先我們需要創建一個業務請求接口,在這之前我們先來講解下他在接口中用到的一些註解的含義:
1.@Query、@QueryMap
用於get請求傳遞參數,如下:

@GET("jsonstudy/list.do")
Call<Data> getData(@Query("page") int page,@Query("rows") int rows);

他就等同於:

 @GET("jsonstudy/list.do?page=page&rows=rows")
    Call<Data> getData();

就是把@Query的key-value添加到url後面組成get方式的參數,@QueryMap同理。

2.@Field
用於post請求傳遞參數,需要在請求接口方法上添加@FormUrlEncoded,即以表單的方式傳遞參數,如下:

 //post傳值是動態的運行的
    @POST("user/login.do?")
    @FormUrlEncoded
    Call<LoginResult> getData(@Field("userName") String name, @Field("passWord") String pw);

3.@Body
用於post請求,它是根據轉換方式將實例對象轉化爲對應字符串傳遞參數.比如Retrofit添加GsonConverterFactory則是將body轉化爲gson字符串進行傳遞.

4.@Path
用於URL上的佔位符,如下所示:

@GET("user/{id}/login.do?")
Call<LoginResult> getData(@Path("id") int id);

意思也就是將id變量的值替換到url上的id位置,Path可以用於任何請求方式,包括Post,Put,Delete等等

5.@Part
配合@Multipart使用,一般用於文件上傳:

 // 上傳單個文件
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadFile(
            @Part("description") RequestBody description,
            @Part MultipartBody.Part file);

    // 上傳多個文件
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadMultipleFiles(
            @Part("description") RequestBody description,
            @Part MultipartBody.Part file1,
            @Part MultipartBody.Part file2);

以上就是一些基本的註解的釋義。

下面開始上代碼,講解詳細用法:
(1)創建Retrofit的實例

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.0.108:8080/JsonStudy/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

(2)創建接口

interface ApiManager {
    @GET("jsonstudy/list.do?page=1&rows=18")
    Call<Data> getData();

     //post傳值是動態的運行的
    @POST("user/login.do?")
    @FormUrlEncoded
    Call<LoginResult> getData(@Field("userName") String name, @Field("passWord") String pw);
}

(3)異步請求這個接口(接着創建Retrofit的實例往下寫)

ApiManager apiService = retrofit.create(ApiManager.class);
        Call<LoginResult> call = apiService.getData("xiaoming", "1234");
        call.enqueue(new Callback<LoginResult>() {
            @Override
            public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
                Log.e("===", "執行了:" + response.raw());
                if (response.body().getCurrentUser() != null
                        && response.body().getCurrentUser().size() > 0
                        && response.body().getCode().equals("000")) {
                    LoginResult.CurrentUserBean bean = response.body().getCurrentUser().get(0);
                    Log.e("===", "bean:" + bean.getUserName());
                    text_go.setText(bean.getUserName());
                    Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this,"用戶不存在",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<LoginResult> call, Throwable t) {
                Log.e("===", "請求失敗:" + call.request().url());
            }
        });

以上就是我寫的一個簡單的登錄的操作。

到這裏Retrofit的基本使用已經講完了,這個新的框架也是最近剛學,可能還存在一些問題,歡迎大家指正。

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