成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Android網(wǎng)絡(luò)編程之9Retrofit2前篇[基本使用]

Nosee / 1954人閱讀

摘要:創(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官方認(rèn)可,不了解OKHttp的請(qǐng)查看本系列的前作。

1.使用前準(zhǔn)備

老生長(zhǎng)談,先配置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)限:

這次我們?cè)L問的網(wǎng)站產(chǎn)生了變化,我們用淘寶ip庫(kù),里面有訪問接口的說明:
1. 請(qǐng)求接口(GET):
/service/getIpInfo.php?ip=[ip地址字串]

2. 響應(yīng)信息:
(json格式的)國(guó)家 、?。ㄗ灾螀^(qū)或直轄市)、市(縣)、運(yùn)營(yíng)商

3. 返回?cái)?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ò) 編寫實(shí)體類

我們可以用JSON字符串轉(zhuǎn)換成Java實(shí)體類(POJO)這個(gè)網(wǎng)站將Json轉(zhuǎn)為實(shí)體類,經(jīng)過修改的實(shí)體類如下:

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;
    }
    ...
 }
請(qǐng)求網(wǎng)絡(luò)接口
public interface IpService{
    @GET("getIpInfo.php")
    Call getIpMsg(@Query("ip")String ip);
}

Retrofit提供的請(qǐng)求方式注解有@GET和@POST等,分別代表GET請(qǐng)求和POST請(qǐng)求,我們?cè)谶@里訪問的界面是“getIpInfo.php”。參數(shù)注解有@PATH和@Query等,@Query就是我們的請(qǐng)求的鍵值對(duì)的設(shè)置,在這里@Query("ip")代表鍵,“String ip”則代表值。

創(chuàng)建Retrofit
   String 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ù)形成完整的請(qǐng)求地址;addConverterFactory用于指定返回的參數(shù)數(shù)據(jù)類型,這里我們支持String和Gson類型。

用Retrofit創(chuàng)建接口文件
 IpService ipService = retrofit.create(IpService.class);
 Callcall=ipService.getIpMsg(ip);

用retrofit創(chuàng)建我們之前定義的IpService接口對(duì)象,并調(diào)用該接口定義的getIpMsg方法得到Call對(duì)象。

用Call請(qǐng)求網(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) {

            }
        });

這里是異步請(qǐng)求網(wǎng)絡(luò),回調(diào)的Callback是運(yùn)行在主線程的。得到返回的Response后將返回?cái)?shù)據(jù)的country字段用Toast顯示出來(lái)。如果想同步請(qǐng)求網(wǎng)絡(luò)請(qǐng)使用 call.execute(),如果想中斷網(wǎng)絡(luò)請(qǐng)求則可以使用 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);
        Callcall=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) {

            }
        });
    }
3.請(qǐng)求參數(shù)

上文講了Retrofit訪問網(wǎng)絡(luò)的基本方法,接下來(lái)我們來(lái)了解下Retrofit常用的請(qǐng)求參數(shù)。

請(qǐng)求方法

請(qǐng)求方法除了上文講到的@GET,還有@POST、@PUT、@DELETE、@HEAD、@OPTIONS、@PATCH、@HTTP。其中@HTTP用來(lái)替換以上7個(gè),其他的分別對(duì)應(yīng)著不同的請(qǐng)求方法,不明白的請(qǐng)查看Android網(wǎng)絡(luò)編程(一)HTTP協(xié)議原理這一篇文章。

@Query

前面的例子就用了Query用來(lái)查詢參數(shù)。

public interface IpService{
    @GET("getIpInfo.php")
    Call getIpMsg(@Query("ip")String ip);
}
@QueryMap

如果Query參數(shù)比較多,那么可以通過@QueryMap方式將所有的參數(shù)集成在一個(gè)Map統(tǒng)一傳遞。

public interface BlueService {
    @GET("book/search")
    Call getSearchBooks(@QueryMap Map options);
}
@Path

@Path用來(lái)替換路徑。

public interface ApiStores {
    @GET("adat/sk/{cityId}.html")
    Call getWeather(@Path("cityId") String cityId);
}
@Body

@Body與@POST注解一起使用,提供查詢主體內(nèi)容,其中ApiInfo是一個(gè)bean類。

public interface ApiStores {
        @POST("client/shipper/getCarType")
        Call getCarType(@Body ApiInfo apiInfo);
    }
@Headers
interface SomeService {
 @GET("some/endpoint")
 @Headers("Accept-Encoding: application/json")
 Call getCarType();
}

@Headers用來(lái)添加頭部信息,上面用的是固定頭部,也可以采用動(dòng)態(tài)頭部:

interface SomeService {
 @GET("some/endpoint")
 Call someEndpoint(
 @Header("Location") String location);
}
@Multipart

@Multipart用來(lái)上傳文件

public interface FileUploadService {  
    @Multipart
    @POST("upload")
    Call upload(@Part("description") RequestBody description,
                              @Part MultipartBody.Part file);
}

github源碼下載

參考資料
Retrofit 2.0文件上傳
RxJava 與 Retrofit 結(jié)合的最佳實(shí)踐
Retrofit2使用初探
android 介紹Retrofit的簡(jiǎn)單使用
Retrofit框架使用筆記
Retrofit 解析 JSON 數(shù)據(jù)
用 Retrofit 2 簡(jiǎn)化 HTTP 請(qǐng)求
Android Retrofit 2.0使用

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70585.html

相關(guān)文章

  • Android網(wǎng)絡(luò)編程7源碼解析OkHttp前篇[請(qǐng)求網(wǎng)絡(luò)]

    摘要:異步請(qǐng)求當(dāng)正在運(yùn)行的異步請(qǐng)求隊(duì)列中的數(shù)量小于并且正在運(yùn)行的請(qǐng)求主機(jī)數(shù)小于時(shí)則把請(qǐng)求加載到中并在線程池中執(zhí)行,否則就再入到中進(jìn)行緩存等待。通常情況下攔截器用來(lái)添加,移除或者轉(zhuǎn)換請(qǐng)求或者響應(yīng)的頭部信息。 前言 學(xué)會(huì)了OkHttp3的用法后,我們當(dāng)然有必要來(lái)了解下OkHttp3的源碼,當(dāng)然現(xiàn)在網(wǎng)上的文章很多,我仍舊希望我這一系列文章篇是最簡(jiǎn)潔易懂的。 1.從請(qǐng)求處理開始分析 首先OKHttp...

    blastz 評(píng)論0 收藏0
  • Android網(wǎng)絡(luò)編程10Retrofit2后篇[請(qǐng)求參數(shù)]

    摘要:前言在上一篇網(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...中我們了解了Retrofi...

    nihao 評(píng)論0 收藏0
  • Swoole協(xié)程旅-前篇

    摘要:協(xié)程完全有用戶態(tài)程序控制,所以也被成為用戶態(tài)的線程。目前支持協(xié)程的語(yǔ)言有很多,例如等。協(xié)程之旅前篇結(jié)束,下一篇文章我們將深入分析原生協(xié)程部分的實(shí)現(xiàn)。 寫在最前 ??Swoole協(xié)程經(jīng)歷了幾個(gè)里程碑,我們需要在前進(jìn)的道路上不斷總結(jié)與回顧自己的發(fā)展歷程,正所謂溫故而知新,本系列文章將分為協(xié)程之旅前、中、后三篇。 前篇主要介紹協(xié)程的概念和Swoole幾個(gè)版本協(xié)程實(shí)現(xiàn)的主要方案技術(shù); 中篇主...

    terasum 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<