Android基础——网络技术
一、使用HttpURLConnection请求网络
HttpURLConnection使用
首先需要获取HttpURLConnection的实例,一般只需要创建一个URL对象,并传入目标的网络地址,然后调用以下openConnection()方法就可以了。
如下所示:
val url = URL("https://www.baidu.com.com"); // 传入一个目标地址创建URL对象 val connection = url.openConnection() as HttpURLConnection // 使用URL对象中的openConnection方法建立连接
在得到实例后,可以设置以下HTTP请求所需的方法。常用的方法主要有两个,常用的方法主要有两个:GET和POST,分别代表着获取和提交数据。如下所示, 设置请求为获取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)
本文来自博客园,作者:maplerain,转载请注明原文链接:https://www.cnblogs.com/maplerain/p/16273871.html 博主B站
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?