网络编程(五)

Retrofit:是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的

1.使用前准备

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'//ConverterFactory的String依赖包

}

当然还有网络权限。

2.使用示例:

淘宝查询IP地址的接口:/service/getIpInfo.PHP?ip=[ip地址字串]

返回的是(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商。

{

“code”: 0,

”data”: {

“ip”: ”210.75.225.254”,

”country”: ”\u4e2d\u56fd”,

”area”: ”\u534e\u5317”,

“region”: ”\u5317\u4eac\u5e02”,

”city”: ”\u5317\u4eac\u5e02”,

”county”: ”“,

”isp”: ”\u7535\u4fe1”,

“country_id”: ”86”,

”area_id”: ”100000”,

”region_id”: ”110000”,

”city_id”: ”110000”,

“county_id”: ”-1”,

”isp_id”: ”100017”

}

编写实体类,IpModel  (包含响应码和IpData数据实体类)和IpData实体类,代码就不放了。

网络请求接口:

public interface IpService{    

@GET("getIpInfo.php")    

Call getIpMsg(@Query("ip")String ip);

}

Retrofit提供的请求方式注解有@GET和@POST等,分别代表GET请求和POST请求,我们在这里访问的界面是“getIpInfo.php”。参数注解有@PATH和@Query等,@Query就是我们的请求的键值对的设置,在这里@Query(“ip”)代表键,“String ip”则代表值。

创建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”)定义的参数形成完整的请求地址;addConverterFactory用于指定返回的参数数据类型,这里我们支持String和Gson类型

用Retrofit创建接口文件:

IpService ipService = retrofit.create(IpService.class); 

Call call=ipService.getIpMsg(ip);

用retrofit创建我们之前定义的IpService接口对象,并调用该接口定义的getIpMsg方法得到Call对象。拿到Call对象接下来就可以像OkHttp那样访问网络了。前面两篇文章有讲过。

我们主要探索下retrofit的请求参数本身。

请求方法

请求方法除了上文讲到的@GET,还有@POST、@PUT、@DELETE、@HEAD、@OPTIONS、@PATCH、@HTTP。其中@HTTP用来替换以上7个,其他的分别对应着不同的Http的请求方法。

@Query:单个查询参数

public interface IpService{   

 @GET("getIpInfo.php")    

Call getIpMsg(@Query("ip")String ip);

}

@QueryMap:多个查询参数

public interface BlueService {

 @GET("book/search")    

Call getSearchBooks(@QueryMap Mapoptions);

}

@Path:动态的替换访问路径

public interface ApiStores {   

 @GET("adat/sk/{cityId}.html")   

 Call getWeather(@Path("cityId") String cityId);

}

接口传过来的参数会替换请求接口中{cityId}的值,做到动态的改变请求接口。

@Body与@POST:一起使用,提供查询主体内容,其中ApiInfo是一个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();

}

这种是设置固定的请求头,当然我们也可以设置动态的,如下:

interface SomeService { 

@GET("some/endpoint") 

Call someEndpoint(@Header("Location") String location);

}

@Multipart:用来上传文件

public interface FileUploadService {      

@Multipart    

@POST("upload")    

Call upload(@Part("description") RequestBody description,@Part MultipartBody.Part file);

}

大体的用法介绍完毕。

你可能感兴趣的:(网络编程(五))