作者:Zyao89;轉載請保留此行,謝謝;
很久前就想學習下Retrofit了,不過總是沒有時間,正好最近新項目要用到網絡請求,正好研究了下Retrofit2.2的簡單使用方法,大致記錄如下:
Retrofit與okhttp共同出自于Square公司,retrofit就是對okhttp做了一層封裝。網絡請求依賴Okhttp,我們只需要通過簡單的配置就能使用retrofit來進行網絡請求了。
增加依賴:
compile 'com.squareup.retrofit2:retrofit:2.2.0'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.2.0'//ConverterFactory的Gson依賴包
這里需要值得注意的是導入的retrofit2包的版本必須要一致,否則就會報錯。
這里我建立的請求地址 baseUrl
是
http://200.200.200.182:9999/
創建一個Retrofit對象:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://200.200.200.182:9999/")
//增加返回值為Gson的支持(以實體類返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
接著只需要定義對應請求的接口,用來返回一個Call對象,下面舉個栗子:
假設,我需要一個登錄用戶的操作,服務端給我的API請求地址是:
http://200.200.200.182:9999/login
請求協議是json格式,如:
{
"username" : "admin",
"password" : "123456"
}
@POST
這里先采用POST
請求,使用注解@POST("login")
,有如下兩種方式:
方法一:
public interface RetrofitService
{
@FormUrlEncoded
@POST("login")
Call<ResponseBody> login(@Field("username") String username, @Field("password") String password);
}
方法二:
public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@POST("login")
Call<ResponseBody> login(@Body User user);
}
//------------- User.java --------------------
/**
* Created by zyao89 on 2017/2/24.
*/
public class User
{
String username;
String password;
public User(String username, String password)
{
this.username = username;
this.password = password;
}
@Override
public String toString()
{
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
接下來我們用之前的Retrofit對象創建一個mRetrofitService接口對象,也就是我們上面定義的那個RetrofitService接口,并且得到我們的Call對象,如下:
mRetrofitService = retrofit.create(RetrofitService.class);//這里采用的是Java的動態代理模式
接著用mRetrofitService調用我們上面定義的接口中方法,如:
public void login(View view)
{
// 方法一
Call<ResponseBody> login = mRetrofitService.login("admin", "123456");
// 方法二
// User user = new User("admin", "123456");
// Call<ResponseBody> login = mRetrofitService.login(user);
login.enqueue(getCallback());
}
利用得到的Call對象,然后我們就發出網絡請求了,這里介紹下enqueue
是異步操作,execute()
為同步操作。
private Callback<ResponseBody> getCallback()
{
return new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
{//請求成功
printLogCat("Code: " + response.code());
printLogCat("Message: " + response.message());
printLogCat("isSuccessful: " + response.isSuccessful());
try
{
printLogCat("Body: " + response.body().string());
}
catch (IOException e)
{
e.printStackTrace();
}
printLogCat("");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t)
{//請求失敗
printLogCat("ERROR: " + t.getMessage());
printLogCat("");
}
};
}
@GET
同樣的協議,我們可以用GET
請求來一遍,使用注解@ GET("")
,有如下兩種方式:
方式一:
public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@GET("login")
Call<ResponseBody> login(@Query("username") String username, @Query("password") String password);
}
public void login(View view)
{
Call<ResponseBody> login = mRetrofitService.login("bacdd", "333444");
login.enqueue(getCallback());
}
請求URL:
URL: /login?username=bacdd&password=333444
方法二:
public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@GET("{url}")
Call<ResponseBody> login(@Path("url") String url, @Query("username") String username, @Query("password") String password);
}
@Path()
為占位符,可被參數動態替換;
public void login(View view)
{
Call<ResponseBody> login = mRetrofitService.login("login", "admin", "123444");
login.enqueue(getCallback());
}
請求URL:
URL: /login?username= admin&password= 123444
@DELETE & @PUT
用法與前兩者基本相同,這里就不闡述了;
參考代碼如下:
@Headers({"Content-type:application/json"})
@PUT("put")
Call<ResponseBody> put(@Body User user);
@Headers({"Content-type:application/json"})
@HTTP(method = "DELETE", path = "/delete", hasBody = true)
Call<ResponseBody> delete(@Body DeleteID id);
備注下,Retrofit2.0以后,貌似DELETE請求是不可以帶@Body參數的,所以,可改寫成以上方式。
總結
- @Path:所有在網址中的參數(URL的問號前面);
- @Query:URL問號后面的參數;
- @QueryMap:相當于多個@Query ;
- @Field:用于POST請求,提交單個數據 ;(使用@Field時記得添加@FormUrlEncoded)
- @Body:相當于多個@Field,以對象的形式提交
若需要重新定義接口地址,可以使用@Url,將地址以參數的形式傳入即可。如:
@GET
Call<User> getUser(@Url String url);
Github項目地址:zyao89/DemoRetrofit
個人博客:http://zyao89.me