【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用_第1頁
【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用_第2頁
【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用_第3頁
【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用_第4頁
【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】Android開源網絡請求框架Retrofit的介紹使用

Retrofit是Square公司開發(fā)的一款針對Android網絡請求的框架,Retrofit2底層基于OkHttp實現(xiàn)的,OkHttp現(xiàn)在已經得到Google官方認可,大量的app都采用OkHttp做網絡請求,其源碼詳見

OkHttpGithub

。本文全部是在Retrofit2.0+版本基礎上論述,所用例子全部來自豆瓣Api首先先來看一個完整Get請求是如何實現(xiàn):創(chuàng)建業(yè)務請求接口,具體代碼如下:這里需要稍作說明,@GET注解就表示get請求,@Query表示請求參數(shù),將會以key=value的方式拼接在url后面需要創(chuàng)建一個Retrofit的示例,并完成相應的配置這里的baseUrl就是網絡請求URL相對固定的地址,一般包括請求協(xié)議(如Http)、域名或IP地址、端口號等,當然還會有很多其他的配置,下文會詳細介紹。還有addConverterFactory方法表示需要用什么轉換器來解析返回值,GsonConverterFactory.create()表示調用Gson庫來解析json返回值,具體的下文還會做詳細介紹。調用請求方法,并得到Call實例Call其實在Retrofit中就是行使網絡請求并處理返回值的類,調用的時候會把需要拼接的參數(shù)傳遞進去,此處最后得到的url完整地址為/v2/book/search?q=%E5%B0%8F%E7%8E%8B%E5%AD%90&tag=&start=0&count=3使用Call實例完成同步或異步請求同步請求這里需要注意的是網絡請求一定要在子線程中完成,不能直接在UI線程執(zhí)行,不然會crash異步請求二、如何使用首先需要在build.gradle文件中引入需要的第三包,配置如下:compile'com.squareup.retrofit2:retrofit:2.1.0'compile'com.squareup.retrofit2:converter-gson:2.1.0'compile'com.squareup.retrofit2:adapter-rxjava:2.1.0'引入完第三包接下來就可以使用Retrofit來進行網絡請求了。接下來會對不同的請求方式做進一步的說明。Get方法請求參數(shù)都會以key=value的方式拼接在url后面,Retrofit提供了兩種方式設置請求參數(shù)。第一種就是像上文提到的直接在interface中添加@Query注解,還有一種方式是通過Interceptor實現(xiàn),直接看如何通過Interceptor實現(xiàn)請求參數(shù)的添加。

CustomInterceptor

implements

Interceptor

{

@Override

intercept(Chain

chain)

throws

IOException

{

=

chain.();

HttpUrl

httpUrl

=

.url().newBuilder()

.addQueryParameter(,

)

.build();

=

.newBuilder().url(httpUrl).build();

return

ceed();

}

}addQueryParameter就是添加請求參數(shù)的具體代碼,這種方式比較適用于所有的請求都需要添加的參數(shù),一般現(xiàn)在的網絡請求都會添加token作為用戶標識,那么這種方式就比較適合。創(chuàng)建完成自定義的Interceptor后,還需要在Retrofit創(chuàng)建client處完成添加addInterceptor(

CustomInterceptor())如果Query參數(shù)比較多,那么可以通過@QueryMap方式將所有的參數(shù)集成在一個Map統(tǒng)一傳遞,還以上文中的get請求方法為例

{

()

Call<BookSearchResponse>

getSearchBooks(

Map<String,

String>

options);

}調用的時候將所有的參數(shù)集合在統(tǒng)一的map中即可Map<,

>

options

=

HashMap<>();

map.put(,

);

map.put(,

);

map.put(,

);

map.put(,

);

<BookSearchResponse>

=

mBlueService.getSearchBooks(options);假如你需要添加相同Key值,但是value卻有多個的情況,一種方式是添加多個@Query參數(shù),還有一種簡便的方式是將所有的value放置在列表中,然后在同一個@Query下完成添加,實例代碼如下:

{

()

Call<BookSearchResponse>

getSearchBooks(()

List<String>

name);

}最后得到的url地址為http//api.douban./v2/book/?q=leadership&q=beyond%feelings如果請求參數(shù)為非必填,也就是說即使不傳該參數(shù),服務端也可以正常解析,那么如何實現(xiàn)呢?其實也很簡單,請求方法定義處還是需要完整的Query注解,某次請求如果不需要傳該參數(shù)的話,只需填充null即可。針對文章開頭提到的get的請求,加入按以下方式調用<BookSearchResponse>

=

mBlueService.getSearchBooks(,

,

,

);那么得到的url地址為/v2/book/search?q=&=&count=如果請求的相對地址也是需要調用方傳遞,那么可以使用@Path注解,示例代碼如下:()

Call<BookResponse>

getBook(()

String

id);業(yè)務方想要在地址后面拼接書籍id,那么通過Path注解可以在具體的調用場景中動態(tài)傳遞,具體的調用方式如下:<BookResponse>

=

mBlueService.getBook();此時的url地址為:@Path可以用于任何請求方式,包括Post,Put,Delete等等Post請求Post請求需要把請求參數(shù)放置在請求體中,而非拼接在url后面,先來看一個簡單的例子

()

Call<String>

addReviews(()

String

bookId,

()

String

title,

()

String

content,

()

String

rating);這里有幾點需要說明的@FormUrlEncoded將會自動將請求參數(shù)的類型調整為application/x-www-form-urlencoded,假如content傳遞的參數(shù)為GoodLuck,那么最后得到的請求體就是FormUrlEncoded不能用于Get請求@Field注解將每一個請求參數(shù)都存放至請求體中,還可以添加encoded參數(shù),該參數(shù)為boolean型,具體的用法為encoded參數(shù)為true的話,key-value-pair將會被編碼,即將中文和特殊字符進行編碼轉換上述Post請求有4個請求參數(shù),假如說有更多的請求參數(shù),那么通過一個一個的參數(shù)傳遞就顯得很麻煩而且容易出錯,這個時候就可以用FieldMap

()

Call<String>

addReviews(

Map<String,

String>

fields);如果Post請求參數(shù)有多個,那么統(tǒng)一封裝到類中應該會更好,這樣維護起來會非常方便

()

Call<String>

addReviews(

Reviews

reviews);

{

;

;

;

;

}除了Get和Post請求,Http請求還包括Put,Delete等等,用法和Post相似,所以就不再單獨介紹了。上傳因為需要用到Multipart,所以需要單獨拿出來介紹,先看一個具體上傳的例子首先還是需要新建一個interface用于定義上傳方法public

interface

FileUploadService

{

上傳單個文件

@Multipart

@POST()

Call<ResponseBody>

uploadFile(

@Part()

RequestBody

description,

@Part

MultipartBody.Part

file);

上傳多個文件

@Multipart

@POST()

Call<ResponseBody>

uploadMultipleFiles(

@Part()

RequestBody

description,

@Part

MultipartBody.Part

file1,

@Part

MultipartBody.Part

file2);

}接下來我們還需要在Activity和Fragment中實現(xiàn)兩個工具方法,代碼如下:public

MULTIPART_FORM_DATA

=

;

RequestBody

createPartFromString(

descriptionString)

{

RequestBody.create(

MediaType.parse(MULTIPART_FORM_DATA),

descriptionString);

}

MultipartBody.Part

prepareFilePart(

partName,

fileUri)

{

File

file

=

FileUtils.getFile(,

fileUri);好了,接下來就是最終的上傳文件代碼了Uri

file1Uri

=

...

從文件選擇器或者攝像頭中獲取

Uri

file2Uri

=

...

創(chuàng)建上傳的service實例

FileUploadService

service

=

ServiceGenerator.createService(FileUploadService.class);

創(chuàng)建文件的part

(photo,

video,

...)

MultipartBody.Part

body1

=

prepareFilePart(,

file1Uri);

MultipartBody.Part

body2

=

prepareFilePart(,

file2Uri);

添加其他的part

RequestBody

description

=

createPartFromString();

最后執(zhí)行異步請求操作

Call<ResponseBody>

call

=

service.uploadMultipleFiles(description,

body1,

body2);

call.enqueue(new

Callback<ResponseBody>()

{

@Override

public

void

onResponse(Call<ResponseBody>

call,

Response<ResponseBody>

response)

{

Log.v(,

);

}

@Override

public

void

onFailure(Call<ResponseBody>

call,

Throwable

t)

{

Log.e(,

t.getMessage());

}

});三、其他必須知道的事項Retrofit提供了兩個方式定義Http請求頭參數(shù):靜態(tài)方法和動態(tài)方法,靜態(tài)方法不能隨不同的請求進行變化,頭部信息在初始化的時候就固定了。而動態(tài)方法則必須為每個請求都要單獨設置。靜態(tài)方法當然你想添加多個header參數(shù)也是可以的,寫法也很簡單此外也可以通過Interceptor來定義靜態(tài)請求頭添加header參數(shù)Request提供了兩個方法,一個是

header(key,value)

,另一個是

.addHeader(key,value)

,兩者的區(qū)別是,header()如果有重名的將會覆蓋,而addHeader()允許相同key值的header存在然后在OkHttp創(chuàng)建Client實例時,添加RequestInterceptor即可動態(tài)方法調試網絡請求的時候經常需要關注一下請求參數(shù)和返回值,以便判斷和定位問題出在哪里,Retrofit官方提供了一個很方便查看日志的Interceptor,你可以控制你需要的打印信息類型,使用方法也很簡單。首先需要在build.gradle文件中引入logging-interceptorcompile'com.squareup.okhttp3:logging-interceptor:3.4.1'同上文提到的CustomInterceptor和RequestInterceptor一樣,添加到OkHttpClient創(chuàng)建處即可,完整的示例代碼如下:{

HttpLoggingInterceptor

logging

=

HttpLoggingInterceptor();

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder()

.addInterceptor(

CustomInterceptor())

.addInterceptor(logging)

.connectTimeout(DEFAULT_TIMEOUT,

TimeUnit.SECONDS)

.build();

}HttpLoggingInterceptor提供了4中控制打印信息類型的等級,分別是NONE,BASIC,HEADERS,BODY,接下來分別來說一下相應的打印信息類型。NONE沒有任何日志信息Basic打印請求類型,URL,請求體大小,返回值狀態(tài)以及返回值的大小Headers打印返回請求和返回值的頭部信息,請求類型,URL以及返回值狀態(tài)碼Body打印請求和返回值的頭部和body信息假如說你的某一個請求不是以base_url開頭該怎么辦呢?別著急,辦法很簡單,看下面這個例子你就懂了

{

Call<ResponseBody>

profilePicture(

String

url);

}

Retrofit

retrofit

=

Retrofit.Builder()

.baseUrl();

.build();

BlueService

service

=

retrofit.c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論