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 @ 2022-05-15 18:01  maplerain  阅读(88)  评论(0)    收藏  举报