国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Retrofit全攻略——基礎(chǔ)篇

2019-11-09 16:12:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

實(shí)際開(kāi)發(fā)過(guò)程中一般都會(huì)選擇一些網(wǎng)絡(luò)框架提升開(kāi)發(fā)效率。隨著Google對(duì)HttpClient 摒棄和Volley框架的逐漸沒(méi)落,OkHttp開(kāi)始異軍突起,而Retrofit則對(duì)OkHttp進(jìn)行了強(qiáng)制依賴,可以簡(jiǎn)單理解Retroifit在OKHttp基礎(chǔ)上進(jìn)一步完善。

Retrofit是由Square公司出品的針對(duì)于Android和java的類(lèi)型安全的Http客戶端,目前推出了2.0+的版本。

Retrofit框架項(xiàng)目地址:https://github.com/square/retrofit。 Retrofit官方文檔地址: http://square.github.io/retrofit/

使用Retrofit

接下來(lái)我們來(lái)學(xué)習(xí)下如何使用Retrofit。 首先需要在app/build.gradle添加依賴。

dependencies { //... //retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0' //如果用到gson解析 需要添加下面的依賴 compile 'com.squareup.retrofit2:converter-gson:2.1.0'}

我們以查號(hào)碼歸屬地接口為例 https://www.juhe.cn/docs/api/id/11

Retrofit不能直接使用,需要進(jìn)行初始化,在這里創(chuàng)建NetWork.java

public class NetWork { PRivate static Retrofit retrofit; /**返回Retrofit*/ public static Retrofit getRetrofit(){ if(retrofit==null){ Retrofit.Builder builder = new Retrofit.Builder();//創(chuàng)建Retrfit構(gòu)建器 retrofit = builder.baseUrl("http://apis.juhe.cn/") //指定網(wǎng)絡(luò)請(qǐng)求的baseUrl .addConverterFactory(GsonConverterFactory.create())//返回的數(shù)據(jù)通過(guò)Gson解析 .build(); } return retrofit; }}

Retrofit需要之地baseUrl,往往一個(gè)項(xiàng)目中有很多接口,接口都使用相同的服務(wù)器地址,這時(shí)候可以把接口地址相同的部分抽取到baseUrl中,Retrofit擴(kuò)展性極好,可以指定返回的數(shù)據(jù)通過(guò)Gson解析,前提你需要保證項(xiàng)目中有Gson框架和com.squareup.retrofit2:converter-gson:2.1.0的依賴。

除了通過(guò)Gson解析還可以使用其它的方式解析,需要的依賴也不同,有如下幾種:

Gson: com.squareup.retrofit:converter-gsonJackson: com.squareup.retrofit:converter-jacksonMoshi: com.squareup.retrofit:converter-moshiProtobuf: com.squareup.retrofit:converter-protobufWire: com.squareup.retrofit:converter-wireSimple xml: com.squareup.retrofit:converter-simplexml

Retrofit需要把Http的請(qǐng)求接口封裝到一個(gè)接口文件中。

public interface NetInterface { //獲取號(hào)碼歸屬地,返回來(lái)類(lèi)型是Bean, 需要兩個(gè)參數(shù)分別為phone何key @GET("mobile/get") Call<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);}

其中Bean是根據(jù)請(qǐng)求的結(jié)果創(chuàng)建的對(duì)象.

方法前添加@GET注解表示當(dāng)前請(qǐng)求是Get方式請(qǐng)求,鏈接的地址是baseUrl+”mobile/get”,baseUrl在初始化Retrofit的時(shí)候指定了,拼到一起就是 http://apis.juhe.cn/mobile/get。 對(duì)于 Retrofit 2.0中新的URL定義方式,這里是我的建議:

baseUrl: 總是以 /結(jié)尾url: 不要以 / 開(kāi)頭

因?yàn)槿绻皇沁@種方式,拼裝后的結(jié)果和你期望的是不一樣的,詳情參考官方文檔。

除了Get請(qǐng)求還有下面幾種請(qǐng)求方式

@POST 表明這是post請(qǐng)求 @PUT 表明這是put請(qǐng)求 @DELETE 表明這是delete請(qǐng)求 @PATCH 表明這是一個(gè)patch請(qǐng)求,該請(qǐng)求是對(duì)put請(qǐng)求的補(bǔ)充,用于更新局部資源 @HEAD 表明這是一個(gè)head請(qǐng)求 @OPTIONS 表明這是一個(gè)option請(qǐng)求 @HTTP 通用注解,可以替換以上所有的注解,其擁有三個(gè)屬性:method,path,hasBody

最后的HTTP通用注解寫(xiě)法比較特殊,請(qǐng)求可以代替之前的請(qǐng)求。下面的寫(xiě)法和之前的@GET效果是一樣的。

/** * method 表示請(qǐng)的方法,不區(qū)分大小寫(xiě) * path表示路徑 * hasBody表示是否有請(qǐng)求體 */@HTTP(method = "get",path = "mobile/get",hasBody = false)Call<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);

@Quert表示查詢參數(shù),用于GET查詢,注解里的字符串是參數(shù)的key值,參數(shù)會(huì)自動(dòng)拼裝到Url后面。 除了上面的注解,再給大家介紹幾種不同的注解。

常用的注解

@Url:使用全路徑復(fù)寫(xiě)baseUrl,適用于非統(tǒng)一baseUrl的場(chǎng)景。示例代碼:

@GET Call<ResponseBody> XXX(@Url String url);

@Streaming:用于下載大文件。示例代碼:

@Streaming @GET Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);//獲取數(shù)據(jù)的代碼ResponseBody body = response.body();long fileSize = body.contentLength();InputStream inputStream = body.byteStream();

@Path:URL占位符,用于替換和動(dòng)態(tài)更新,相應(yīng)的參數(shù)必須使用相同的字符串被@Path進(jìn)行注釋

//實(shí)際請(qǐng)求地址會(huì)給句groupId的值發(fā)生變化--> http://baseurl/group/groupId/users@GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId);

@QueryMap:查詢參數(shù),和@Query類(lèi)似,區(qū)別就是后面需要Map集合參數(shù)。示例代碼:

Call<List<News>> getNews((@QueryMap(encoded=true) Map<String, String> options);

@Body:用于POST請(qǐng)求體,將實(shí)例對(duì)象根據(jù)轉(zhuǎn)換方式轉(zhuǎn)換為對(duì)應(yīng)的json字符串參數(shù),這個(gè)轉(zhuǎn)化方式是GsonConverterFactory定義的。 示例代碼:

@POST("add")Call<List<User>> addUser(@Body User user);

@Field,@FieldMap:Post方式傳遞簡(jiǎn)單的鍵值對(duì),需要添加@FormUrlEncoded表示表單提交

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

@Part,@PartMap:用于POST文件上傳,其中@Part MultipartBody.Part代表文件,@Part(“key”) RequestBody代表參數(shù),需要添加@Multipart表示支持文件上傳的表單。

@Multipart @POST("upload") Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);

完成請(qǐng)求實(shí)例

了解了Retrofit,我們用Retrofit請(qǐng)求完成請(qǐng)求,Retrofit使用起來(lái)比較省事,核心代碼如下所示:

//初始化Retrofit,加載接口NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class);//請(qǐng)求接口netInterface.getAddress(editText.getText().toString(),"你的app key") .enqueue(new Callback<Bean>() { @Override public void onResponse(Call<Bean> call, Response<Bean> response) { //請(qǐng)求成功 Bean bean = response.body(); //... } @Override public void onFailure(Call<Bean> call, Throwable t) { //請(qǐng)求失敗 } });

Retrofit會(huì)自動(dòng)在子線程中進(jìn)行網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求結(jié)束切換到主線程中,而且內(nèi)部使用了線程池,對(duì)網(wǎng)絡(luò)請(qǐng)求的緩存控制的也非常到位,網(wǎng)絡(luò)響應(yīng)速度也是很快的,使用起來(lái)非常的爽!

RxJava和Retrofit結(jié)合

RxJava非常強(qiáng)大,就連Retrofit都要抱下他的大腿,Retrofit也可以用RxJava方式進(jìn)行網(wǎng)絡(luò)請(qǐng)求,只需要對(duì)上面的代碼進(jìn)行改造即可。

首先添加框架依賴。

dependencies { //... compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.6' compile 'com.google.code.gson:gson:2.8.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' //如果用到gson解析 需要添加下面的依賴 compile 'com.squareup.retrofit2:converter-gson:2.1.0' //Retrofit使用RxJava需要的依賴 compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'}

修改Retrofit初始化的代碼:

public class NetWork { private static Retrofit retrofit; /**返回Retrofit*/ public static Retrofit getRetrofit(){ if(retrofit==null){ //創(chuàng)建Retrfit構(gòu)建器 Retrofit.Builder builder = new Retrofit.Builder(); //指定網(wǎng)絡(luò)請(qǐng)求的baseUrl retrofit = builder.baseUrl("http://apis.juhe.cn/") //返回的數(shù)據(jù)通過(guò)Gson解析 .addConverterFactory(GsonConverterFactory.create()) //使用RxJava模式 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } return retrofit; }}

上面代碼我們通過(guò),添加代碼addCallAdapterFactory(RxJavaCallAdapterFactory.create())就變成了使用RxJava模式。

接口也需要修改,把方法的返回值類(lèi)型由Call改成了RxJava中的Observable。

public interface NetInterface { //獲取號(hào)碼歸屬地,返回來(lái)類(lèi)型是Bean, 需要兩個(gè)參數(shù)分別為phone何key @GET("mobile/get") Observable<Bean> getAddress(@Query("phone") String phone, @Query("key") String key);}

接下來(lái)修改最終網(wǎng)絡(luò)請(qǐng)求的代碼,可以改成RxJava方式了。

NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class); //RxJava方式 netInterface.getAddress(editText.getText().toString(),"你的app key") .subscribeOn(Schedulers.io())//設(shè)置網(wǎng)絡(luò)請(qǐng)求在子線程中 .observeOn(AndroidSchedulers.mainThread())// 回調(diào)在主線程中 .subscribe(new Action1<Bean>() { @Override public void call(Bean bean) { //請(qǐng)求成功 } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { //請(qǐng)求失敗 } });

總結(jié)

這是Retrofit基礎(chǔ)篇, 后面有時(shí)間再繼續(xù)深入研究


更多精彩請(qǐng)關(guān)注微信公眾賬號(hào)likeDev 這里寫(xiě)圖片描述


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湖北省| 板桥市| 周宁县| 神农架林区| 沛县| 文安县| 依兰县| 桃园县| 长沙市| 聂荣县| 上栗县| 昌乐县| 永仁县| 延庆县| 祁门县| 隆安县| 晋宁县| 共和县| 建阳市| 关岭| 达拉特旗| 烟台市| 天等县| 景德镇市| 大悟县| 榆树市| 于田县| 揭西县| 慈利县| 铁岭市| 若尔盖县| 泗阳县| 中江县| 磴口县| 嘉祥县| 上蔡县| 广昌县| 建湖县| 海兴县| 比如县| 依安县|