前言
在Android应用的使用中,总是存在不可避免的上传/获取数据的场景,所以学习Android网络通信相关的技术还是很有必要的。本文主要总结了HttpURLConnection
,okhttp
以及Retrofit
三个常用网络请求工具的基本使用,以及JSON解析工具gson
。
网络请求
先来复习一下(最为简单的)网络请求模型
sequenceDiagram
Client->>Server: 发送请求
Server-->>Server: 处理请求
Server-->>Client: 返回数据
Client->>Client: 处理数据
此处去除了较多细节,如:在发送请求前的确认连接等等。因为在入门时较少关注这块内容,所以在此不表
HttURLConnection
对于发送HTTP请求,Android原生SDK提供HttpURLConnection
这一工具以满足需求。
HttpURLConnection 支持系统级连接池,并且在系统层面做了缓存策略处理,可以加快重复请求的速度。
这里先简单介绍HttURLConnection的使用方法
请求之前
在Android中,应用访问网络需要申请android.permission.INTERNET
权限。因为该权限为安装时权限,所以在编写网络请求之前,只需在AbdriudManifest.xml
内声明即可。
<manifest xmlns:android="schemas.android.com/apk/res/android"
package="xxxxxxx">
<uses-permission android:name="android.permission.INTERNET">
...
</manifest>
发送请求
在发送请求前,我们需要创建一个请求。也就是创建HttpURLConnection实例。
只需要使用urlObject.openConnection()
方法即可获取。接下来就可以使用该对象设置HTTP请求的相应细节(例如请求方法,连接超时等)
val url = URL("http://xxxxxxxxx")
val connection = url.openConnection() as HttpURLConnection
connection.apply {
requestMethod = "GET"
connectTimeout = 8000
readTimeout = 8000
}
返回数据
对于服务器返回的HTTP数据,我们使用connectionObject.getInputStream()
获取输入流并读取。在读取完成后,再调用connectionObject.close()
关闭连接
val response = StringBuilder()
//输入流
val input = connection.inputStream
val reader = BufferedReader(InputStreamReader(input))
reader.use {
reader.forEachLine{
response.append(it)
}
}
connection.close()
POST请求
与上方演示的GET请求不同,POST请求需要提交数据。我们可以手动获取对应请求的输出流connectionObject.outputStream
,并将数据写入当中
connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("xxxxxxxxxx")