摘要:前言在上一篇網(wǎng)絡(luò)編程九前篇基本使用中我們了解了的最基本的方式訪問網(wǎng)絡(luò)的寫法以及請求參數(shù)的簡單介紹。在這里我們?nèi)耘f訪問淘寶庫。可以看到請求數(shù)據(jù)是一個(gè)字符串,因?yàn)樘詫殠觳⒉恢С执祟愋退圆粫?huì)返回我們需要的地理信息數(shù)據(jù)。
前言
在上一篇[Android網(wǎng)絡(luò)編程(九)Retrofit2前篇[基本使用]](http://www.jianshu.com/p/c383...中我們了解了Retrofit的最基本的GET方式訪問網(wǎng)絡(luò)的寫法以及請求參數(shù)的簡單介紹。這一篇我們來詳細(xì)的了解Retrofit的請求參數(shù)。
1.GET請求訪問網(wǎng)絡(luò) 動(dòng)態(tài)配置URL地址:@PathRetrofit提供了很多的請求參數(shù)注解,使得請求網(wǎng)路時(shí)更加便捷。在這里我們?nèi)耘f訪問淘寶ip庫。其中,@Path用來動(dòng)態(tài)的配置URL地址。請求網(wǎng)絡(luò)接口代碼如下所示。
public interface IpServiceForPath { @GET("{path}/getIpInfo.php?ip=59.108.54.37") CallgetIpMsg(@Path("path") String path); }
在GET注解中包含了{(lán)path},它對應(yīng)著@Path注解中的"path",而用來替換{path}的正是需要傳入的 "String path"的值。接下來請求網(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"來替換 @GET注解中的{path}的值。
動(dòng)態(tài)指定查詢條件:@Query與@QueryMap在上一篇中我們用@Query來動(dòng)態(tài)的替換ip地址為了能更方便的得到該ip所對應(yīng)的地理信息:
public interface IpServiceForQuery{ @GET("getIpInfo.php") CallgetIpMsg(@Query("ip")String ip); }
但是在網(wǎng)絡(luò)請求中一般為了更精確的查找到我們所需要的數(shù)據(jù),需要傳入很多的查詢參數(shù),如果用@Query會(huì)比較麻煩,這時(shí)我們可以采用@QueryMap,將所有的參數(shù)集成在一個(gè)Map統(tǒng)一傳遞:
public interface IpServiceForQueryMap { @GET("getIpInfo.php") Call2.POST請求訪問網(wǎng)絡(luò) 傳輸數(shù)據(jù)類型為鍵值對:@FieldgetIpMsg(@QueryMap Map options); }
傳輸數(shù)據(jù)類型為鍵值對,這是我們最常用的POST請求數(shù)據(jù)類型,淘寶ip庫支持?jǐn)?shù)據(jù)類型為鍵值對的POST請求:
public interface IpServiceForPost { @FormUrlEncoded @POST("getIpInfo.php") CallgetIpMsg(@Field("ip") String first); }
首先用到@FormUrlEncoded注解來標(biāo)明這是一個(gè)表單請求,然后在getIpMsg方法中使用@Field注解來標(biāo)示所對應(yīng)的String類型數(shù)據(jù)的鍵,從而組成一組鍵值對進(jìn)行傳遞。接下來請求網(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字符串作為請求體發(fā)送到服務(wù)器,請求網(wǎng)絡(luò)接口代碼為:
public interface IpServiceForPostBody { @POST("getIpInfo.php") CallgetIpMsg(@Body Ip ip); }
用@Body這個(gè)注解標(biāo)識參數(shù)對象即可,retrofit會(huì)將Ip對象轉(zhuǎn)換為字符串。
public class Ip { private String ip; public Ip(String ip) { this.ip = ip; } }
請求網(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抓包,如下圖所示。
可以看到請求數(shù)據(jù)是一個(gè)Json字符串,因?yàn)樘詫歩p庫并不支持此類型所以不會(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類型,它用來傳遞簡單的鍵值對。請求網(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注解來標(biāo)示起來。其他的都一樣,這里就不贅述了。
3.消息報(bào)頭HeaderHttp請求中,為了防止攻擊或是過濾掉不安全的訪問或是添加特殊加密的訪問等等,用來減輕服務(wù)器的壓力和保證請求的安全,通常都會(huì)在消息報(bào)頭中攜帶一些特殊的消息頭處理。Retrofit也提供了@Header來添加消息報(bào)頭。添加消息報(bào)頭有兩種方式,一種是靜態(tài)的,另一種是動(dòng)態(tài)的,先來看靜態(tài)的方式,如下所示。
interface SomeService { @GET("some/endpoint") @Headers("Accept-Encoding: application/json") CallgetCarType(); }
使用@Headers注解添加消息報(bào)頭,如果想要添加多個(gè)消息報(bào)頭,則可以使用{}包含起來:
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方法來動(dòng)態(tài)的添加消息報(bào)頭。
github源碼下載
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70584.html
摘要:創(chuàng)建增加返回值為的支持這里的加上之前定義的參數(shù)形成完整的請求地址用于指定返回的參數(shù)數(shù)據(jù)類型,這里我們支持和類型。完整的代碼如下增加返回值為的支持請求參數(shù)上文講了訪問網(wǎng)絡(luò)的基本方法,接下來我們來了解下常用的請求參數(shù)。 前言 Retrofit是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,而OkHttp現(xiàn)在已經(jīng)得到Google官方...
閱讀 2975·2021-11-24 10:22
閱讀 3045·2021-11-23 10:10
閱讀 1353·2021-09-28 09:35
閱讀 1752·2019-08-29 13:16
閱讀 1395·2019-08-26 13:29
閱讀 2782·2019-08-26 10:27
閱讀 678·2019-08-26 10:09
閱讀 1436·2019-08-23 18:05