今天說下關於網絡的東西,公司的項目的網絡請求都是用okhttp搭的,前陣子在網上看到Retrofit這東西,它跟okhttp一樣都是Square公司,retrofit就是對okhttp做了一層封裝。我覺得它對於okhttp的區別最大的一點就是用註解的方式來設置參數請求等。所以可以說RxAndroid跟它算是絕配。今天只是簡單玩了下get請求。例子有點基礎,我也在探究階段0.0 好了。接下來進入正題吧
來看下項目中build.gradle文件的配置
其實本例子rxandroid還沒講到,所以只需要導入上三個retrofit的包就ok了。需要注意的是版本需要一樣。
首先看下我完整的接口,裏面是json字符串。http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=20&pageIndex=2
分類一下,首先 http://litchiapi.jstv.com/ 我作爲了baseUrl 。api/GetFeeds 這段我作爲了get請求的url。column=0&PageSize=20&pageIndex=2 這些是請求的參數。上面的3段除了baseUrl其他都用註解的方式聲明。
下面看下具體用法。首先我們先定義一個請求接口,看下代碼:
/**
* Created by Administrator on 2016/9/29.
*/
public interface RetrofitTestInterface {
@GET("api/GetFeeds")
Call<Bean> getServiceBeans(@Query("column") int column,
@Query("PageSize") int pageSize,
@Query("pageIndex") int pageIndex);
}
上面用@GET聲明瞭get請求的地址,@Query用來聲明參數,多個請求的話我們還可以包裝成Map,但是註解就不是@Query了,而是@QueryMap。時間原因,本例子沒講,後續我再加上,這裏需要注意的是聲明的參數需跟請求的Url的參數對應。下面我們看具體用法:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
private String baseUrl = "http://litchiapi.jstv.com/";
private Button mBtn;
private Call<Bean> serviceBeans;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = ((Button) findViewById(R.id.btn));
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitTestInterface retrofitTestInterface = retrofit
.create(RetrofitTestInterface.class);
serviceBeans = retrofitTestInterface.getServiceBeans(0, 20, 2);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceBeans.enqueue(new Callback<Bean>() {
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) {
Log.e(TAG, "請求成功");
Log.e(TAG, response.body().getParamz().getFeeds().get(0).getData().getSubject());
}
@Override
public void onFailure(Call<Bean> call, Throwable t) {
}
});
}
});
}
}
我們通過 new Retrofit.Builder 方法來構建 Retrofit 對象,然後通過.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
設置基本url,添加gson解析器,就是表示需要用什麼轉換器來解析返回值,GsonConverterFactory.create()表示調用Gson庫來解析json返回值。最後調用build()完成。
然後我們通過retrofit對象調用
RetrofitTestInterface retrofitTestInterface = retrofit
.create(RetrofitTestInterface.class);
來得到我們定義好的接口對象。
通過接口調用裏面的方法然後傳入參數得到Call:
serviceBeans = retrofitTestInterface.getServiceBeans(0, 20, 2);
最後我們通過call的異步得打請求得到的數據:
serviceBeans.enqueue(new Callback<Bean>() {
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) {
Log.e(TAG, "請求成功");
Log.e(TAG, response.body().getParamz().getFeeds().get(0).getData().getSubject());
}
@Override
public void onFailure(Call<Bean> call, Throwable t) {
}
});
它有同步和異步兩種請求方式,同步的話是通過call.execute().body();得到請求體。需要注意的是同步需要另開線程,而異步則不用。其中onResponse方法是請求成功的回調方法,而onFailure()方法是請求失敗的回調。請求成功之後我們想要的數據已經解析好變成response對象。
點擊按鈕之後返回數據成功:
好了,是不是很簡單。今天這個例子很基礎。希望大家都能看懂。後續的話有時間再添加其他方式的使用介紹,畢竟它的功能確實很強大。
共勉