摘要:前言在上一篇網(wǎng)絡(luò)編程九前篇基本使用中我們了解了的最基本的方式訪問網(wǎng)絡(luò)的寫法以及請(qǐng)求參數(shù)的簡(jiǎn)單介紹。在這里我們?nèi)耘f訪問淘寶庫(kù)??梢钥吹秸?qǐng)求數(shù)據(jù)是一個(gè)字符串,因?yàn)樘詫殠?kù)并不支持此類型所以不會(huì)返回我們需要的地理信息數(shù)據(jù)。
前言
在上一篇[Android網(wǎng)絡(luò)編程(九)Retrofit2前篇[基本使用]](http://www.jianshu.com/p/c383...中我們了解了Retrofit的最基本的GET方式訪問網(wǎng)絡(luò)的寫法以及請(qǐng)求參數(shù)的簡(jiǎn)單介紹。這一篇我們來(lái)詳細(xì)的了解Retrofit的請(qǐng)求參數(shù)。
1.GET請(qǐng)求訪問網(wǎng)絡(luò) 動(dòng)態(tài)配置URL地址:@PathRetrofit提供了很多的請(qǐng)求參數(shù)注解,使得請(qǐng)求網(wǎng)路時(shí)更加便捷。在這里我們?nèi)耘f訪問淘寶ip庫(kù)。其中,@Path用來(lái)動(dòng)態(tài)的配置URL地址。請(qǐng)求網(wǎng)絡(luò)接口代碼如下所示。
public interface IpServiceForPath { @GET("{path}/getIpInfo.php?ip=59.108.54.37") CallgetIpMsg(@Path("path") String path); }
在GET注解中包含了{(lán)path},它對(duì)應(yīng)著@Path注解中的"path",而用來(lái)替換{path}的正是需要傳入的 "String path"的值。接下來(lái)請(qǐng)求網(wǎng)絡(luò)的代碼如下所示。
String url = "http://ip.taobao.com/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); IpServiceForPath ipService = retrofit.create(IpServiceForPath.class); Callcall=ipService.getIpMsg("service");//1 call.enqueue(new Callback () { @Override public void onResponse(Call call, Response response) { String country= response.body().getData().getCountry(); Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call call, Throwable t) { } });
在注釋1處,傳入"service"來(lái)替換 @GET注解中的{path}的值。
動(dòng)態(tài)指定查詢條件:@Query與@QueryMap在上一篇中我們用@Query來(lái)動(dòng)態(tài)的替換ip地址為了能更方便的得到該ip所對(duì)應(yīng)的地理信息:
public interface IpServiceForQuery{ @GET("getIpInfo.php") CallgetIpMsg(@Query("ip")String ip); }
但是在網(wǎng)絡(luò)請(qǐng)求中一般為了更精確的查找到我們所需要的數(shù)據(jù),需要傳入很多的查詢參數(shù),如果用@Query會(huì)比較麻煩,這時(shí)我們可以采用@QueryMap,將所有的參數(shù)集成在一個(gè)Map統(tǒng)一傳遞:
public interface IpServiceForQueryMap { @GET("getIpInfo.php") Call2.POST請(qǐng)求訪問網(wǎng)絡(luò) 傳輸數(shù)據(jù)類型為鍵值對(duì):@FieldgetIpMsg(@QueryMap Map options); }
傳輸數(shù)據(jù)類型為鍵值對(duì),這是我們最常用的POST請(qǐng)求數(shù)據(jù)類型,淘寶ip庫(kù)支持?jǐn)?shù)據(jù)類型為鍵值對(duì)的POST請(qǐng)求:
public interface IpServiceForPost { @FormUrlEncoded @POST("getIpInfo.php") CallgetIpMsg(@Field("ip") String first); }
首先用到@FormUrlEncoded注解來(lái)標(biāo)明這是一個(gè)表單請(qǐng)求,然后在getIpMsg方法中使用@Field注解來(lái)標(biāo)示所對(duì)應(yīng)的String類型數(shù)據(jù)的鍵,從而組成一組鍵值對(duì)進(jìn)行傳遞。接下來(lái)請(qǐng)求網(wǎng)絡(luò)的代碼如下所示。
String url = "http://ip.taobao.com/service/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); IpServiceForPost ipService = retrofit.create(IpServiceForPost.class); Call傳輸數(shù)據(jù)類型Json字符串:@Bodycall=ipService.getIpMsg("59.108.54.37"); call.enqueue(new Callback () { @Override public void onResponse(Call call, Response response) { String country= response.body().getData().getCountry(); Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call call, Throwable t) { } });
我們也可以用POST方式將Gson字符串作為請(qǐng)求體發(fā)送到服務(wù)器,請(qǐng)求網(wǎng)絡(luò)接口代碼為:
public interface IpServiceForPostBody { @POST("getIpInfo.php") CallgetIpMsg(@Body Ip ip); }
用@Body這個(gè)注解標(biāo)識(shí)參數(shù)對(duì)象即可,retrofit會(huì)將Ip對(duì)象轉(zhuǎn)換為字符串。
public class Ip { private String ip; public Ip(String ip) { this.ip = ip; } }
請(qǐng)求網(wǎng)絡(luò)的代碼基本上都是一致的:
String url = "http://ip.taobao.com/service/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); IpServiceForPostBody ipService = retrofit.create(IpServiceForPostBody.class); Callcall=ipService.getIpMsg(new Ip(ip)); call.enqueue(new Callback () { @Override public void onResponse(Call call, Response response) { String country= response.body().getData().getCountry(); Log.i("wangshu","country"+country); Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call call, Throwable t) { } }); }
運(yùn)行程序用Fiddler抓包,如下圖所示。
可以看到請(qǐng)求數(shù)據(jù)是一個(gè)Json字符串,因?yàn)樘詫歩p庫(kù)并不支持此類型所以不會(huì)返回我們需要的地理信息數(shù)據(jù)。
單個(gè)文件上傳:@Partpublic interface UploadFileForPart { @Multipart @POST("user/photo") CallupdateUser(@Part MultipartBody.Part photo, @Part("description") RequestBody description); }
Multipart注解表示允許多個(gè)@Part,updateUser方法第一個(gè)參數(shù)是準(zhǔn)備上傳的圖片文件,使用了MultipartBody.Part類型,另一個(gè)參數(shù)是RequestBody類型,它用來(lái)傳遞簡(jiǎn)單的鍵值對(duì)。請(qǐng)求網(wǎng)絡(luò)代碼如下所示。
... File file = new File(Environment.getExternalStorageDirectory(), "wangshu.png"); RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/png"), file); MultipartBody.Part photo = MultipartBody.Part.createFormData("photos", "wangshu.png", photoRequestBody); UploadFileForPart uploadFile = retrofit.create(UploadFileForPart.class); Call多個(gè)文件上傳:@PartMapcall = uploadFile.updateUser(photo, RequestBody.create(null, "wangshu")); ...
@Multipart @POST("user/photo") CallupdateUser(@PartMap Map photos, @Part("description") RequestBody description);
和單文件上傳是類似的,只是使用Map封裝了上傳的文件,并用@PartMap注解來(lái)標(biāo)示起來(lái)。其他的都一樣,這里就不贅述了。
3.消息報(bào)頭HeaderHttp請(qǐng)求中,為了防止攻擊或是過濾掉不安全的訪問或是添加特殊加密的訪問等等,用來(lái)減輕服務(wù)器的壓力和保證請(qǐng)求的安全,通常都會(huì)在消息報(bào)頭中攜帶一些特殊的消息頭處理。Retrofit也提供了@Header來(lái)添加消息報(bào)頭。添加消息報(bào)頭有兩種方式,一種是靜態(tài)的,另一種是動(dòng)態(tài)的,先來(lái)看靜態(tài)的方式,如下所示。
interface SomeService { @GET("some/endpoint") @Headers("Accept-Encoding: application/json") CallgetCarType(); }
使用@Headers注解添加消息報(bào)頭,如果想要添加多個(gè)消息報(bào)頭,則可以使用{}包含起來(lái):
interface SomeService { @GET("some/endpoint") @Headers({ "Accept-Encoding: application/json", "User-Agent: MoonRetrofit" }) CallgetCarType(); }
動(dòng)態(tài)的方式添加消息報(bào)頭如下所示。
interface SomeService { @GET("some/endpoint") CallgetCarType( @Header("Location") String location); }
使用@Header注解,可以通過調(diào)用getCarType方法來(lái)動(dòng)態(tài)的添加消息報(bào)頭。
github源碼下載
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70584.html
摘要:創(chuàng)建增加返回值為的支持這里的加上之前定義的參數(shù)形成完整的請(qǐng)求地址用于指定返回的參數(shù)數(shù)據(jù)類型,這里我們支持和類型。完整的代碼如下增加返回值為的支持請(qǐng)求參數(shù)上文講了訪問網(wǎng)絡(luò)的基本方法,接下來(lái)我們來(lái)了解下常用的請(qǐng)求參數(shù)。 前言 Retrofit是Square公司開發(fā)的一款針對(duì)Android網(wǎng)絡(luò)請(qǐng)求的框架,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,而OkHttp現(xiàn)在已經(jīng)得到Google官方...
閱讀 3012·2021-11-24 10:22
閱讀 3058·2021-11-23 10:10
閱讀 1367·2021-09-28 09:35
閱讀 1761·2019-08-29 13:16
閱讀 1400·2019-08-26 13:29
閱讀 2798·2019-08-26 10:27
閱讀 687·2019-08-26 10:09
閱讀 1450·2019-08-23 18:05