网络请求库有很多种,例如使用HttpUrlConnection,使用HttpClient,或者使用Volley,使用OKHttp,而现在的主流是使用OKHttp + Retrofit,往细了讲本人也不是很清楚其中的区别,今天也不讲它们的区别。Retrofit是一个十分强大的优秀的网络请求库,只要熟悉了以后,使用起来也是十分方便的。
Retrofit地址:https://github.com/square/retrofit
Retrofit帮助文档地址:http://square.github.io/retrofit/
大家可以从这个地址compile这个库,先看下使用Retrofit所需要的库,需要使用到OKHttp,因为Retrofit依赖于它,然后因为要获取JSON数据,所以要解析JSON,所以使用Gson:
地址:http://apistore.baidu.com/apiworks/servicedetail/794.html
接口地址:http://apis.baidu.com/apistore/mobilenumber/mobilenumber
首先要获取Api Key,接下来调用时要使用。APIStore中一个用户只有一个Api Key,可以调用平台所有即用服务。怎么申请这里不讲了。
这个接口的API主机地址为:http://apis.baidu.com,资源地址为:/apistore/mobilenumber/mobilenumber,我们需要一个key等于apikey的Header和一个key等于phone的查询关键字,该请求为GET请求。所以我们需要构造一个GET请求,添加一个Header,添加一个Query关键字,访问该API返回的数据格式如下:
{
"errNum": 0,
"retMsg": "success",
"retData": {
"phone": "XXXXXXXXXXX",
"prefix": "XXXXXXX",
"supplier": "移动",
"province": "上海",
"city": "上海",
"suit": "136卡"
}
}
这里我的手机号码用X来代替了,实际得到的是自己输入的号码,然后是创建数据对象,相信使用过Gson库都知道为什么要这么做。数据对象可以帮助我们更好的处理数据:
其中@Header用来添加Header,@Query用来添加查询关键字
Retrofit地址:https://github.com/square/retrofit
Retrofit帮助文档地址:http://square.github.io/retrofit/
大家可以从这个地址compile这个库,先看下使用Retrofit所需要的库,需要使用到OKHttp,因为Retrofit依赖于它,然后因为要获取JSON数据,所以要解析JSON,所以使用Gson:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.6.2'
我们首先肯定需要一个API地址来测试,这里使用百度APIStore的手机归属地查询服务来测试地址:http://apistore.baidu.com/apiworks/servicedetail/794.html
接口地址:http://apis.baidu.com/apistore/mobilenumber/mobilenumber
首先要获取Api Key,接下来调用时要使用。APIStore中一个用户只有一个Api Key,可以调用平台所有即用服务。怎么申请这里不讲了。
这个接口的API主机地址为:http://apis.baidu.com,资源地址为:/apistore/mobilenumber/mobilenumber,我们需要一个key等于apikey的Header和一个key等于phone的查询关键字,该请求为GET请求。所以我们需要构造一个GET请求,添加一个Header,添加一个Query关键字,访问该API返回的数据格式如下:
{
"errNum": 0,
"retMsg": "success",
"retData": {
"phone": "XXXXXXXXXXX",
"prefix": "XXXXXXX",
"supplier": "移动",
"province": "上海",
"city": "上海",
"suit": "136卡"
}
}
这里我的手机号码用X来代替了,实际得到的是自己输入的号码,然后是创建数据对象,相信使用过Gson库都知道为什么要这么做。数据对象可以帮助我们更好的处理数据:
/**
* PhoneResult
*
* @author yuzhentao
*/
public class PhoneResult {
private int errNum;
private String retMsg;
private RetDataEntity retData;
public int getErrNum() {
return errNum;
}
public void setErrNum(int errNum) {
this.errNum = errNum;
}
public String getRetMsg() {
return retMsg;
}
public void setRetMsg(String retMsg) {
this.retMsg = retMsg;
}
public RetDataEntity getRetData() {
return retData;
}
public void setRetData(RetDataEntity retData) {
this.retData = retData;
}
public static class RetDataEntity {
private String phone;
private String prefix;
private String supplier;
private String province;
private String city;
private String suit;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSupplier() {
return supplier;
}
public void setSupplier(String supplier) {
this.supplier = supplier;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
}
}
然后根据官方文档的说明创建接口:/**
* PhoneService
*
* @author yuzhentao
*/
public interface PhoneService {
@GET("/apistore/mobilenumber/mobilenumber")
Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);
}
GET方式就是用@GET,@GET里面填写的就是资源地址,方法的参数就是我们需要传入的Value。根据API文档来@Header或者@query。其中@Header用来添加Header,@Query用来添加查询关键字
构建好接口之后,分4步来走:
1.创建Retrofit对象
2.创建访问API的请求
3.发送请求
4.处理结果
/**
* 主界面
*
* @author yuzhentao
*/
public class MainActivity extends Activity {
private static final String BASE_URL = "http://apis.baidu.com";
private static final String API_KEY = "";//这里输入Api Key
private Context context;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
context = this;
et = (EditText) findViewById(R.id.edittext_activity_main);
findViewById(R.id.button_activity_main).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
query();
}
});
}
/**
* 查询
*/
private void query() {
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(BASE_URL).build();
PhoneService phoneService = retrofit.create(PhoneService.class);
Call<PhoneResult> phoneResultCall = phoneService.getResult(API_KEY, et.getText().toString());
phoneResultCall.enqueue(new Callback<PhoneResult>() {
@Override
public void onResponse(Call<PhoneResult> call, Response<PhoneResult> response) {
if (response.isSuccessful()) {
Log.e("yuzhentao", "获取成功");
PhoneResult phoneResult = response.body();
if (phoneResult != null) {
PhoneResult.RetDataEntity retDataEntity = phoneResult.getRetData();
Toast.makeText(context, retDataEntity.getCity(), Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<PhoneResult> call, Throwable t) {
Log.e("yuzhentao", "获取失败");
}
});
}
}
关于GsonConverterFactory.create()是什么呢?这是用来转换服务器数据到对象使用的。该Demo中使用API返回的数据是JSON格式,所以使用Gson来转换,如果服务器返回的是其他类型的数据,则根据需要编写对应的解析方法。
或许Retrofit一开始使用起来比较麻烦,但是只要我们会使用了,以后就是一帆风顺,相信以后的工作中大家都会使用到的,希望对大家有点帮助。
效果图:
Demo地址:http://download.csdn.net/detail/qq_23940659/9470427
最后感谢:http://www.devwiki.net/2016/03/02/Retrofit-Use-Course-1/