最近一直在學習php,也有人問我你一個做app的學php干嘛。實不相瞞,換了很多家公司后發(fā)現(xiàn)每家公司的前臺后臺都是冤家,學php的原因就是想能夠自己寫接口,完全自己來做幾乎不可能,但是一些小的功能實現(xiàn)還是可以的。但是這樣就很容易造成,把自己已經(jīng)掌握的知識給忘了,所以就想到了以這種方式記錄下來,方便自己經(jīng)常復習,當然能幫到別人最好了。
剛開始接觸的網(wǎng)絡訪問用的還是Apache的HttpClient,覺得真好用啊,而且自己還二次封裝了一個類,新項目直接拷貝過去用,并且一直沉迷在自己的極樂世界中,但是突然有一天發(fā)現(xiàn)用HttpClient需要導入Apache包了,WTF?? 谷歌拋棄了Apache??這時我才發(fā)現(xiàn)自己早就被潮流扔在了后面,然后就開始用URLConnection,講真 我從來沒用過這么繁瑣的訪問方法,于是我一直在尋找好用的框架,前幾天關注了郭大嬸的公眾號才發(fā)現(xiàn)自己還差得遠,原來世界上還有Retrofit這么個東西,然后又開始了我的學習之路。
---------------------------------------------------------------------------------------說正事分割線-----------------------------------------------------------------------------------------
Retrofit說到底還是Square對okhttp的封裝,沒有那么神秘,用起來方便,理解簡單。到底怎么用呢?
先導包
compile'io.reactivex:rxjava:1.1.0'//Rx的包
compile'io.reactivex:rxandroid:1.1.0'//Rx的包
compile'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
compile'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依賴包
compile'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'//CallAdapterFactory的Rx依賴包
compile'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依賴包
compile'com.google.code.gson:gson:2.6.2'//Gosn解析包
多說一句retrofit2包的版本必須要一致,否則就會報錯。
Retrofit需要定義一個接口來返回我們的Call對象
Post:
public interface RequestSerives {
@POST("index/log")
Call?getUser(@Query("name1") String name2,
@Query("pswd") String pwd);
}
Get:
public interface RequestSerives {
@GET("index/log/{name}")
CallgetUser(
@Path("name") String name);}
}
這里用到的@POST,@GET相信很容易理解,就是通過post,get方法來訪問。
先說一下post:
@Query("name1")? String name2,就是我們請求鍵值對的設置name1是key,name2就是value,這個很容易理解。
再說下get:
請求地址后面的{name}類似于占位符,@Path("name") String name還是鍵值對形式,會把key對應的value放到{key}所在的位置,間接的幫我們拼接了URL。
創(chuàng)建完接口我們就需要來定義Retrofit了:
Retrofit retrofit;
retrofit=new Retrofit.Builder()
.baseUrl("http://192.168.0.104/Think/public/index/")//url
.addConverterFactory(ScalarsConverterFactory.create())//增加返回值為String的支持
.build();
然后利用retrofit對象創(chuàng)建一個RequestSerives就是我們前面定義的接口:
RequestSerives requestSerives;
requestSerives=retrofit.create(RequestSerives.class);
有很多同學到這里就看不懂了,其實這里不用深究create返回的就是一個動態(tài)代理對象,先看下源碼:

當我們調(diào)用requestSerives.getUser();的時候其實是走了動態(tài)代理的invoke方法,在這里Retrofit巧妙的理由注解把接口轉(zhuǎn)換成了一個HTTP請求
然后開始訪問:
Call call =requestSerives.getUser("xx","123");
call.enqueue(newCallback() {
@Override
public voidonResponse(Call call,Response response) {
Log.e("成功",response.body().toString());
tv.setText(response.body().toString());
}
@Override
public voidonFailure(Call call,Throwable t) {
Log.e("失敗","失敗");
}
});
最后別忘了加網(wǎng)絡訪問權限,到這里我們的Retrofit已經(jīng)可以訪問了,是不是比我們之前用的簡單多了