摘要:創(chuàng)建增加返回值為的支持這里的加上之前定義的參數(shù)形成完整的請求地址用于指定返回的參數(shù)數(shù)據(jù)類型,這里我們支持和類型。完整的代碼如下增加返回值為的支持請求參數(shù)上文講了訪問網(wǎng)絡(luò)的基本方法,接下來我們來了解下常用的請求參數(shù)。
前言
Retrofit是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架,Retrofit2底層基于OkHttp實現(xiàn)的,而OkHttp現(xiàn)在已經(jīng)得到Google官方認(rèn)可,不了解OKHttp的請查看本系列的前作。
1.使用前準(zhǔn)備老生長談,先配置build.gradle:
dependencies { ... compile "com.squareup.retrofit2:retrofit:2.1.0" compile "com.squareup.retrofit2:converter-gson:2.1.0" compile "com.squareup.retrofit2:converter-scalars:2.1.0"http://ConverterFactory的String依賴包 }
當(dāng)然別忘了在manifest加入訪問網(wǎng)絡(luò)的權(quán)限:
這次我們訪問的網(wǎng)站產(chǎn)生了變化,我們用淘寶ip庫,里面有訪問接口的說明:
1. 請求接口(GET):
/service/getIpInfo.php?ip=[ip地址字串]
2. 響應(yīng)信息:
(json格式的)國家 、?。ㄗ灾螀^(qū)或直轄市)、市(縣)、運(yùn)營商
3. 返回數(shù)據(jù)格式:
{ “code”: 0, ”data”: { “ip”: ”210.75.225.254”, ”country”: ”u4e2du56fd”, ”area”: ”u534eu5317”, “region”: ”u5317u4eacu5e02”, ”city”: ”u5317u4eacu5e02”, ”county”: ”“, ”isp”: ”u7535u4fe1”, “country_id”: ”86”, ”area_id”: ”100000”, ”region_id”: ”110000”, ”city_id”: ”110000”, “county_id”: ”-1”, ”isp_id”: ”100017” } }
其中code的值的含義為,0:成功,1:失敗。
2.用Retrofit異步訪問網(wǎng)絡(luò) 編寫實體類我們可以用JSON字符串轉(zhuǎn)換成Java實體類(POJO)這個網(wǎng)站將Json轉(zhuǎn)為實體類,經(jīng)過修改的實體類如下:
IpModel.java:
public class IpModel { private int code; private IpData data; public void setCode(int code) { this.code = code; } public int getCode() { return this.code; } public void setData(IpData data) { this.data = data; } public IpData getData() { return this.data; } }
IpData.java:
public class IpData { private String country; private String country_id; private String area; private String area_id; private String region; private String region_id; private String city; private String city_id; private String county; private String county_id; private String isp; private String isp_id; private String ip; public void setCountry(String country) { this.country = country; } public String getCountry() { return this.country; } public void setCountry_id(String country_id) { this.country_id = country_id; } ... }請求網(wǎng)絡(luò)接口
public interface IpService{ @GET("getIpInfo.php") CallgetIpMsg(@Query("ip")String ip); }
Retrofit提供的請求方式注解有@GET和@POST等,分別代表GET請求和POST請求,我們在這里訪問的界面是“getIpInfo.php”。參數(shù)注解有@PATH和@Query等,@Query就是我們的請求的鍵值對的設(shè)置,在這里@Query("ip")代表鍵,“String ip”則代表值。
創(chuàng)建RetrofitString url = "http://ip.taobao.com/service/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) //增加返回值為String的支持 .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build();
這里的baseUrl加上之前@GET("getIpInfo.php")定義的參數(shù)形成完整的請求地址;addConverterFactory用于指定返回的參數(shù)數(shù)據(jù)類型,這里我們支持String和Gson類型。
用Retrofit創(chuàng)建接口文件IpService ipService = retrofit.create(IpService.class); Callcall=ipService.getIpMsg(ip);
用retrofit創(chuàng)建我們之前定義的IpService接口對象,并調(diào)用該接口定義的getIpMsg方法得到Call對象。
用Call請求網(wǎng)絡(luò)并處理回調(diào)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) { } });
這里是異步請求網(wǎng)絡(luò),回調(diào)的Callback是運(yùn)行在主線程的。得到返回的Response后將返回數(shù)據(jù)的country字段用Toast顯示出來。如果想同步請求網(wǎng)絡(luò)請使用 call.execute(),如果想中斷網(wǎng)絡(luò)請求則可以使用 call.cancel()。
完整的代碼如下:
public class MainActivity extends AppCompatActivity { private Button bt_request; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_request = (Button) findViewById(R.id.bt_request); bt_request.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getIpInformation("59.108.54.37"); } }); } private void getIpInformation(String ip) { String url = "http://ip.taobao.com/service/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) //增加返回值為String的支持 .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); IpService ipService = retrofit.create(IpService.class); Call3.請求參數(shù)call=ipService.getIpMsg(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) { } }); }
上文講了Retrofit訪問網(wǎng)絡(luò)的基本方法,接下來我們來了解下Retrofit常用的請求參數(shù)。
請求方法請求方法除了上文講到的@GET,還有@POST、@PUT、@DELETE、@HEAD、@OPTIONS、@PATCH、@HTTP。其中@HTTP用來替換以上7個,其他的分別對應(yīng)著不同的請求方法,不明白的請查看Android網(wǎng)絡(luò)編程(一)HTTP協(xié)議原理這一篇文章。
@Query前面的例子就用了Query用來查詢參數(shù)。
public interface IpService{ @GET("getIpInfo.php") Call@QueryMapgetIpMsg(@Query("ip")String ip); }
如果Query參數(shù)比較多,那么可以通過@QueryMap方式將所有的參數(shù)集成在一個Map統(tǒng)一傳遞。
public interface BlueService { @GET("book/search") Call@PathgetSearchBooks(@QueryMap Map options); }
@Path用來替換路徑。
public interface ApiStores { @GET("adat/sk/{cityId}.html") Call@BodygetWeather(@Path("cityId") String cityId); }
@Body與@POST注解一起使用,提供查詢主體內(nèi)容,其中ApiInfo是一個bean類。
public interface ApiStores { @POST("client/shipper/getCarType") Call@HeadersgetCarType(@Body ApiInfo apiInfo); }
interface SomeService { @GET("some/endpoint") @Headers("Accept-Encoding: application/json") CallgetCarType(); }
@Headers用來添加頭部信息,上面用的是固定頭部,也可以采用動態(tài)頭部:
interface SomeService { @GET("some/endpoint") Call@MultipartsomeEndpoint( @Header("Location") String location); }
@Multipart用來上傳文件
public interface FileUploadService { @Multipart @POST("upload") Callupload(@Part("description") RequestBody description, @Part MultipartBody.Part file); }
github源碼下載
參考資料
Retrofit 2.0文件上傳
RxJava 與 Retrofit 結(jié)合的最佳實踐
Retrofit2使用初探
android 介紹Retrofit的簡單使用
Retrofit框架使用筆記
Retrofit 解析 JSON 數(shù)據(jù)
用 Retrofit 2 簡化 HTTP 請求
Android Retrofit 2.0使用
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70585.html
摘要:異步請求當(dāng)正在運(yùn)行的異步請求隊列中的數(shù)量小于并且正在運(yùn)行的請求主機(jī)數(shù)小于時則把請求加載到中并在線程池中執(zhí)行,否則就再入到中進(jìn)行緩存等待。通常情況下攔截器用來添加,移除或者轉(zhuǎn)換請求或者響應(yīng)的頭部信息。 前言 學(xué)會了OkHttp3的用法后,我們當(dāng)然有必要來了解下OkHttp3的源碼,當(dāng)然現(xiàn)在網(wǎng)上的文章很多,我仍舊希望我這一系列文章篇是最簡潔易懂的。 1.從請求處理開始分析 首先OKHttp...
摘要:前言在上一篇網(wǎng)絡(luò)編程九前篇基本使用中我們了解了的最基本的方式訪問網(wǎng)絡(luò)的寫法以及請求參數(shù)的簡單介紹。在這里我們?nèi)耘f訪問淘寶庫??梢钥吹秸埱髷?shù)據(jù)是一個字符串,因為淘寶庫并不支持此類型所以不會返回我們需要的地理信息數(shù)據(jù)。 前言 在上一篇[Android網(wǎng)絡(luò)編程(九)Retrofit2前篇[基本使用]](http://www.jianshu.com/p/c383...中我們了解了Retrofi...
摘要:協(xié)程完全有用戶態(tài)程序控制,所以也被成為用戶態(tài)的線程。目前支持協(xié)程的語言有很多,例如等。協(xié)程之旅前篇結(jié)束,下一篇文章我們將深入分析原生協(xié)程部分的實現(xiàn)。 寫在最前 ??Swoole協(xié)程經(jīng)歷了幾個里程碑,我們需要在前進(jìn)的道路上不斷總結(jié)與回顧自己的發(fā)展歷程,正所謂溫故而知新,本系列文章將分為協(xié)程之旅前、中、后三篇。 前篇主要介紹協(xié)程的概念和Swoole幾個版本協(xié)程實現(xiàn)的主要方案技術(shù); 中篇主...
閱讀 2914·2021-11-15 18:02
閱讀 3806·2021-10-14 09:43
閱讀 3745·2021-09-08 10:41
閱讀 2526·2019-08-30 15:53
閱讀 1808·2019-08-30 14:14
閱讀 1950·2019-08-29 16:12
閱讀 3148·2019-08-29 14:03
閱讀 1283·2019-08-29 13:46