Android基础——网络技术

一、使用HttpURLConnection请求网络

HttpURLConnection使用

首先需要获取HttpURLConnection的实例,一般只需要创建一个URL对象,并传入目标的网络地址,然后调用以下openConnection()方法就可以了。
如下所示:

val url = URL("https://www.baidu.com.com"); // 传入一个目标地址创建URL对象
val connection = url.openConnection() as HttpURLConnection // 使用URL对象中的openConnection方法建立连接

在得到实例后,可以设置以下HTTP请求所需的方法。常用的方法主要有两个,常用的方法主要有两个:GETPOST,分别代表着获取提交数据。如下所示, 设置请求为获取GET:

connection.requestMethod = "GET"

之后再调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下任务就是对输入流进行读取:

val input = connection.inputStream

最后可以调用disconnect()这个方法将HTTP连接进行关闭:

connection.disconnect()

代码实例

下面是使用HttpURLConnection封装的请求数据的工具类,用于请求json字符串:

//定义一个获取目标地址数据的类HttpGetResult,用于向服务器请求json字符串,定义主构方法以及数据,对数据初始化,并声明其是个数据类。
data class HttpGetResult(private val url: String, val token: String = "", var result: String? = "") {
init{ // 主构函数
val thread01 = Thread{ // 在android4.0之后再主线程使用请求网络都会报错,所以这里需要开启一个子线程
var connection: HttpURLConnection? = null; // 定义一个HttpURLConnection对象需要声明其是可变的并初始化为空
try {
val url = URL(this.url)//使用主构方法传入的地址字符串创建一个统一资源定位器的对象
connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val reader = BufferedReader(InputStreamReader(connection.inputStream))
reader.forEachLine {
result += it
}
} catch (e: Exception) { // 捕捉异常
e.printStackTrace()
Log.d("msg", e.toString())
} finally {
connection?.disconnect() // 手动释放连接
}
}
thread01.start() // 创建线程后记得开启线程
thread01.join(10000) // 主线程等待子线程结束,最多等待十秒
result = result.replace("null","\"0\"") // 对获取的json字符串内容进行置换
result = result.replace("\\{\\}","\"0\"")
}
}

总结

  1.使用目标链接创建一个URL对象(new URL())

  2.建立连接(openConnection()),获取连接对象

  3.设置请求方式(requestMethod)

  4.获取流对象(inputStream),并读取数据

  5.读取完数据后手动释放(disconnect())




二、使用OkHttp请求网络

OkHttp 介绍

  android请求网络当然并不是只能使用HttpURLConnection,有许多出色的网络通信库都可以代替原生的HttpURLConnection,比如OkHttp。
  OkHttp是由Square公司开发的,OkHttp不仅在接口封装上做得简单易用。就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以说是有过之而无不及了,现在已经成为广大android开发者首选的网络通信库。
  OkHttp的项目地址是:网页连接
  在使用OkHttp之前需要先在项目中添加OkHttp库的依赖。再app/build.gradle文件下dependencies添加以下内容:

dependencies{
...
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
}

OkHttp的使用

使用OkHttp首先需要创建一个OkHttpClient请求端对象。

val client = OkHttpClient()

如果要发起一条Http请求,就需要创建一个Request对象:

val request = Request.Builder().build()

当然上述代码只是创建一个空的对象,并没有实际作用。我们可以通过build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址,如下所示。

val request = Request.Builder()
.url("https://wwww.baidu.com")
.build()

之后调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,如下所示:

val response = client.newCall(request).execute()

Resonese 对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:

val responseData = reponse.body?.string()

如果发起的是一条POST请求,会比GET请求稍微复杂一点,我们需要先构建一个Request Body对象来存放待提交的参数,如下所示:

val requestBody = FormBody.Builder()
.add("userName","admin")
.add("password","123456")
.build()

然后在Request.Builder 中调用以下post()方法,并将RequestBody对象传入:

val request = new Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build()

代码实例

下面是使用OkHttp封装的请求数据的工具类,用于请求json字符串:

data class HttpGetResult(private val url: String, val token: String = "", var result: String? = "") {
//以下主构函数使用okHttp获取字符串,需要添加依赖
init{
val thread01 = Thread{
try{
/*首先创建一个OKHttpClient对象*/
val client = OkHttpClient()
val request = Request.Builder().url(this.url).build() // 创建请求对象
val response = client.newCall(request).execute() // 使用newCall接收请求对象,execute()执行发送请求,返回一个response响应对象
val responseData = response.body?.string() // 将接收到的响应对象的躯干内容转换为字符串
//判断response是否为空,如果为空就执行拼接字符串的操作,这里使用函数式api实现
responseData?.let {
result += it
}
/*
以上语句等价于
if(responseData!=null){
result += responseData
}
*/
}catch(e:Exception){
Log.d("msg",e.toString())
result = null
}
}
//开启子线程
thread01.start()
//等待子线程结束
thread01.join()
result = result?.replace("null","\"0\"")
result = result?.replace("\\{\\}","\"0\"")
}
}

总结

  1.先创建一个客户端对象(OkHttpClient)

  2.创建请求对象(Request)

  3.发送请求(newCall().execute()),获取响应对象

  4.读取响应对象(resonse.body)



posted @   maplerain  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
17:02:30
2025年03月12日
本博客主要为个人学习使用,博主目前为某专科学校大二学生,能力尚有所欠缺,若发现文章中存在错误,请在评论区向博主反映,博主会第一时间进行更改或补充,感谢!
点击右上角即可分享
微信分享提示