做一个可以上网的APP在现在已经是移动开发必备的技能了,互联网时代为应用程序提供了实现更多强大功能的基础。本文我将会介绍一下怎么在自己的app中使用网络技术,我这里讲的是使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析。
目录
使用HTTP协议访问网络
对于HTTP协议,我们只要了解它的工作原理就好了,其实也挺简单,就是客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端在对这些数据进行解析和处理就可以了。接下来说一下具体怎么写:
使用HttpURLConnection
在以前Android上发送HTTP请求一般有两种方式:HttpURLConnection和HttpClient。不过后者存在API数量过多、扩展困难等缺点,所以Android团队越来越不建议我们使用这种方式。终于在Android6.0系统中HttpClient功能被完全以述了,标志着此功能正式被弃用,所以我们现在都用HttpURLConnection了。
使用HttpConnection首先需要获取一个他的实例,一般只需要new一个URL对象,并传入目标网络地址,然后调用一下openConnection()方法获得的即是HttpConnection的一个实例,而不需要像平时那样new一个,如下所示:
URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
然后我们先设置一下HTTP请求使用的方法。常用的一般是GET 和POST,看名字就知道GET是从服务器获取数据,POST是提交数据给服务器。写法:
connection.setRequestMethod("GET");
接下来就可以设置一下比如连接超时、读取超时的毫秒数,注意这里是以毫秒为单位的,1000ms=1s啊记住了啊。或者一些服务器希望得到的消息头(header)。这部分就比较自由了,根据实际情况而定,示例:
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
这下我们可以说是连上服务器了,调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下就是对输入流进行读取,然后就可以获取到服务器端返回的数据了:
InputStream inputStream = connection.getInputStream();
最后完了之后我们需要记得调用disconnect()方法将这个HTTP连接关闭,如下所示:
connection.disconnect();
注意:网络请求属于耗时操作,记得需要开启线程来发起网络请求
多线程的使用可以参考一下这里:
Android多线程篇(上)-安卓基础知识整理
Android多线程篇(下)-安卓基础知识整理
使用OkHttp
当然了,进行网络请求并不是只有HttpConnection,实际上现在开源盛行,有许多出色的网络通信库都可以替代原生的HttpConnection,而其中OkHttp就是做的最出色的一个。
在使用OkHttp前,我们需要在项目中添加OkHttp库的依赖。使用一些不是内置的都需要添加依赖,毕竟本来没有,不添加用不了这个应该都懂吧。编辑项目下app/build.gradle文件,在dependencies闭包中添加如下内容:
dependencies{
...
compile 'com.squareup.okhttp3:okhttp:3.8.1'
}
其中3.8.1是我写的时候最新的版本。添加完之后Built一下项目会自动下载两个库,一个OkHttp库,一个Okio库,后者是前者的基础。然后我们就可以开始使用OkHttp了
首先创建一个实例:
OkHttpClient client = new OkHttpClient();
接下来如果想发起一条HTTP协议请求,就需要创建一个Request对象:
Request request = new Request.Builder().build();
这个Request只是一个空的对象,我们可以在build()前面连缀很多其他方法来丰富这个Request对象。比如这样(设置目标网络地址):
Request request = new Request.Builder()
.url("http:/www.baidu.com")
.build();
之后调佣OkHttp的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,写法如下:
Response response = client.newCall(request).execute;
其中Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:
String responseData = response.body().string();
如果是POST请求回避GET请求稍微复杂一点,我们需要先构建出一个RequestBody对象来存放待提交的参数,如下:
RequestBody requestBody = new FormBody.Builder()
.add("uername","admin")
.add("password","123456")
.build();
然后再Request.Builder中调用一下post()方法,将RequestBody对象传入:
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
接下来就可以调用execute()方法来发送请求并获取服务器返回数据了!
OkHttp基本使用就是这样了,大概流程:编辑并创建请求->发送请求并获取返回数据,还是挺简单的吧。
对返回数据进行处理-解析JSON格式数据
使用HTTP协议获取到了服务器的返回数据,但是这个返回数据我们要怎么处理呢?返回的是什么样子的数据?我们现在介绍返回数据的其中一种格式——JSON格式,除此之外还有XML格式,不过对比起XML格式,JSON主要优势在于它体积小,省流量,缺点在于语义性较差,看起来不如XML直观。接下来就介绍怎么去解析JSON格式的数据
使用JSONObject
解析JSON有挺多方法的,可以用官方的JSONObject,也可以使用谷歌的开源库GSON,还有很多很多其他的,说完JSONObject之后就说一下GSON怎么用。
假设我们已经通过OkHttp拿到了服务器返回的数据了,大概这样子(JSON就是这种格式,可以先去了解一下JSON再来看):
[{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"7.0","name":"Boom Beach"},
{"id":"7","version":"3.5","name":"Clash Royale"}]
我们写一个方法来对它进行处理(数据已经转化为String(jsonData),再传给方法):
private void parseJSONWithJSONObject(String jsonData){
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
//通过键名取到它的对应值:
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d(TAG,"id is " + id);
Log.d(TAG,"name is " + name);
Log.d(TAG,"version is " + version);
}
}catch (Exception e){
e.printStackTrace();
}
}
这样我们就拿到了它的每一个json的每一个键并打印出来,也是挺简单的吧。我们再来看看用GSON怎么解析吧
使用GSON
GSON相比JSON,它能直接把一段JSON格式的的字符串自动映射成一个对象,从而不需要我们在手动去编写代码进行解析(getString什么的)
比如一段JSON格式的数据:
{"name":"Tom","age":"20"}
我们可以定义一个Person类,并加入name和age这两个字段,然后简单的调用一下代码就可以将JSON数据自动解析成一个Person对象了:
Gson gson = new Gson();
Person person = gson.fromJson(jsonData,new TyppeToken<List<Person>>(){}.getType());
好了,基本用法就是这样了,还是挺简单的吧?然后我们就可以用people这个对象提取内容了。具体怎么用看具体情况而定吧。
本文内容均出自《第一行代码》(第二版)~~~