这是我参与「第四届青训营 」笔记创作活动的第6天
使用HTTP访问网络
使用HttpURLConnection
在过去,Android上发送HTTP请求一般有两种方式:HttpURLConnection和HttpClient。不过由于HttpClient存在API数量过多、扩展困难等缺点,Android团队越来越不建议我们使用这种方式。终于在Android 6.0系统中,HttpClient的功能被完全移除了,标志着此功能被正式弃用,现在官方建议使用HttpURLConnection。
- 首先先需要获取HttpURLConnection的实例,一般只需创建一个URL对象,并传入目标的网络地址,然后调用一下openConnection()方法即可
val url = URL("https://www.baidu.com")
val connection = url.openConnection() as HttpURLConnection
- 得到了
HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法。常用的方法主要有两个:GET和POST
connection.requestMethod = "GET"
- 接下来可以设置连接超时、读取超时的毫秒数,以及服务器希望得到的一些消息头等
connection.connectTimeout = 8000
connection.readTimeout = 8000
- 之后再调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取
val input = connection.inputStream
- 最后可以调用disconnect()方法将这个HTTP连接关闭
connection.disconnect()
在运行代码前需要声明一下网络权限修改
AndroidManifest.xml中的代码
<uses-permission android:name="android.permission.INTERNET" />
<application
...
</application>
使用OkHttp
OkHttp是由鼎鼎大名的Square公司开发的,这个公司在开源事业上贡献良多,除了OkHttp之外,还开发了Retrofit、Picasso等知名的开源项目。OkHttp不仅在接口封装上做得简单易用,就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以说是有过之而无不及,现在已经成了广大Android开发者首选的网络通信库。
- 使用之前需要在项目中添加依赖,编辑app/build.gradle
dependencies {
...
implementation("com.squareup.okhttp3:okhttp:4.10.0")
}
- 创建一个OkHttpClient的实例
val client = OkHttpClient()
- 如果想要发起一条HTTP请求,就需要创建一个Request对象,在最终的
build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址
val request = Request.Builder()
.url("https://www.baidu.com")
.build()
- 调用OkHttpClient的
newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
val response = client.newCall(request).execute()
Response对象就是服务器返回的数据了,可以使用如下写法来得到返回的具体内容
val responseData = response.body?.string()
如果是发起一条POST请求,会比GET请求稍微复杂一点,需要先构建一个Request Body对象来存放待提交的参数
val requestBody = FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build()
然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入:
val request = Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build()
解析JSON格式数据
比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候更省流量。但缺点在于,它的语义性较差,看起来不如XML直观
使用JSONObject
解析JSON数据也有很多种方法,可以使用官方提供的JSONObject,也可以使用Google的开源库GSON。另外,一些第三方的开源库如Jackson、FastJSON等也非常不错
val jsonArray = JSONArray(jsonData)
for (i in 0 until jsonArray.length()) {
//获取到JSON数组的一个对象
val jsonObject = jsonArray.getJSONObject(i)
//通过名字获取相应的值
val id = jsonObject.getString("id")
val name = jsonObject.getString("name")
val version = jsonObject.getString("version")
Log.d("MainActivity", "id is $id")
Log.d("MainActivity", "name is $name")
Log.d("MainActivity", "version is $version")
}
使用GSON
它的强大之处就在于可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们再手动编写代码进行解析了
- 首先需要添加依赖编辑app/build.gradle文件,在dependencies闭包中添加如下内容
dependencies {
...
implementation 'com.google.code.gson:gson:2.8.5'
}
- 一段JSON格式的数据
{"name":"Tom","age":20},可以定义成一个Person类加入这两个字段
val gson = Gson()
// 将JSON数据自动解析成一个Person对象
val person = gson.fromJson(jsonData, Person::class.java)
解析JSON数组
[{"name":"Tom","age":20}, {"name":"Jack","age":25}, {"name":"Lily","age":22}]
// 借助TypeToken将期望解析成的数据类型传入fromJson()方法中
val typeOf = object : TypeToken<List<Person>>() {}.type
val people = gson.fromJson<List<Person>>(jsonData, typeOf)