Okhttp简介
okhttp是目前android开发中比较流行的一个开源网络请求框架,相比于官网api提供的网络接口有很多优点。
android6.0以前,官方sdk提供的是httpUrlConnection,android6.0以后,已经将这个框架移除了,目前最常见是okhttp
优点
- 1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求
- 2.缓存响应数据来减少重复的网络请求
- 3.即便是网络出现问题时,okhttp依然起作用.它将从常见的链接问题当中回复.
- 4.如果你的服务器有多个IP地址,当地一个失败时,okhttp会自动尝试连接其他的地址
okhttp使用方法
使用方法很简单,只需要在gradle中添加一下依赖,就可自动把需要的jar包引入进来
compile 'com.squareup.okhttp3:okhttp:3.4.1'
同时是要需要注意的是,网络请求需要请求权限
在AndroidMainfest.xml中添加网络权限,如下
<uses-permission android:name="android.permission.INTERNET"/>
okhttp获取json数据
移动应用的开发,难免要用到json数据的获取,一般都是请求数据,然后将数据返回,再进行解析。
由于网络请求可能在多个地方用到,我们可以将起封装成httpUtil类。
1.新建名为HttpUtil的java 类
异步请求方法
public class HttpUtil {
public static void sendRequestWithOkhttp(String address,okhttp3.Callback callback)
{
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
可以看到,我们在类中定义了sendRequeWithOkhttp函数,这就是对于请求函数的封装,每次调用只需把url地址和Callback参数传入即可。
第一步,创建OkhttpClient对象
第二步,通过builde()创建Request对象,并且传入url
第三步,这里创建的是匿名Call对象,将请求放入,enqueue()是异步请求方式。
需要说明的,get请求分为同步和异步,上面的例子是异步的,即传入的Callback参数类似于一个接口,okhttp会自动开启子线程,当请求成功时再回调,通过这种回调机制,我们可以避免服务器响应慢而导致的请求数据失败。(如何回调在后面会展示)
同步请求方法
public class HttpUtil {
public static String sendRequestWithOkhttp(String address)
{
OkHttpClient client=new OkHttpClient();
Request request = new Request.Builder().url(url) .build();
Response response= client.newCall(request).execute();
String message=response.body().string();
return message;
}
}
可以看到,同步请求后,直接返回string数据即可。
为了避免上述提到的问题,我们将以异步请求为例。
2.activity中进行网络请求操作
HttpUtil.sendRequestWithOkhttp("http://guolin.tech/api/china", new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
parseJsonWithJsonObject(response);
}
});
}
我们可以直接调用刚才编写的网络请求工具类,传入url地址即可,这里用到的是郭霖大神的教学地址,它可以返回json数据。
可以看到,我们传入okhttp3.Callback参数即可实现回调,当请求成功时,自动调用onResponse函数,当请求失败,调用onFailure函数。在onResponse中即可以对请求所返回的response进行处理,将其转化为String类型。
3.解析json数据
[{"id":1,"name":"北京"}
- 类似于这样的就是json类型的数据,由两部分组成,键与值构成键值对。
如id name 即为键 1 北京即为值 - 可以根据键来取出对应的值,这其实是一种很巧妙的数据存储方式
- 在2中可以看到有一个 parseJsonWithJsonObject(response)函数,这其实是对json解析的封装。
private void parseJsonWithJsonObject(Response response) throws IOException {
responseData=response.body().string();
try{
JSONArray jsonArray=new JSONArray(responseData);
for(int i=0;i<jsonArray.length();i++)
{
JSONObject jsonObject=jsonArray.getJSONObject(i);
String id=jsonObject.getString("id");
String name=jsonObject.getString("name");
idList.add(id);
nameList.add(name);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
这里采用的是JSONobject方式解析json数据。当然,还有另一种解析方式,这里不具体讲。
首先我们将传入的response转为string对象,然后创建一个jsonArray对象,在转化为jsonobject对象。最后根据json的键取出对应的值
总结
本文主要对请求和解析这两个重要的点进行讲解,对于解析出的数据如何处理细节不再详细讲,测试的时候可以把数据放在listview展示出来,看编写有没有成功。