Android网络技术 | 青训营笔记

93 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

使用HTTP访问网络

使用HttpURLConnection

在过去,Android上发送HTTP请求一般有两种方式:HttpURLConnection和HttpClient。不过由于HttpClient存在API数量过多、扩展困难等缺点,Android团队越来越不建议我们使用这种方式。终于在Android 6.0系统中,HttpClient的功能被完全移除了,标志着此功能被正式弃用,现在官方建议使用HttpURLConnection。

  1. 首先先需要获取HttpURLConnection的实例,一般只需创建一个URL对象,并传入目标的网络地址,然后调用一下openConnection()方法即可
val url = URL("https://www.baidu.com")
val connection = url.openConnection() as HttpURLConnection
  1. 得到了HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法。常用的方法主要有两个:GETPOST
connection.requestMethod = "GET"
  1. 接下来可以设置连接超时、读取超时的毫秒数,以及服务器希望得到的一些消息头等
connection.connectTimeout = 8000
connection.readTimeout = 8000
  1. 之后再调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取
val input = connection.inputStream
  1. 最后可以调用disconnect()方法将这个HTTP连接关闭
connection.disconnect()

在运行代码前需要声明一下网络权限修改AndroidManifest.xml中的代码

<uses-permission android:name="android.permission.INTERNET" />
<application
  ...
</application>

使用OkHttp

OkHttp是由鼎鼎大名的Square公司开发的,这个公司在开源事业上贡献良多,除了OkHttp之外,还开发了Retrofit、Picasso等知名的开源项目。OkHttp不仅在接口封装上做得简单易用,就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以说是有过之而无不及,现在已经成了广大Android开发者首选的网络通信库。

  1. 使用之前需要在项目中添加依赖,编辑app/build.gradle
dependencies {
...
implementation("com.squareup.okhttp3:okhttp:4.10.0")
}
  1. 创建一个OkHttpClient的实例
val client = OkHttpClient()
  1. 如果想要发起一条HTTP请求,就需要创建一个Request对象,在最终的 build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址
val request = Request.Builder()
    .url("https://www.baidu.com")
    .build()
  1. 调用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格式的字符串自动映射成一个对象,从而不需要我们再手动编写代码进行解析了

  1. 首先需要添加依赖编辑app/build.gradle文件,在dependencies闭包中添加如下内容
dependencies {
 ...
 implementation 'com.google.code.gson:gson:2.8.5'
}
  1. 一段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)