android开发,使用kotlin学习HTTP访问网络

简介: android开发,使用kotlin学习HTTP访问网络



HTTP协议的简介

在日常生活中,我们使用手机APP时,APP展示的数据基本上都是通过网络接口从服务器中获取的。

HTTP是一种请求/响应模式的协议,当客户端与在服务器建立连接后,向服务器发送请求,称为HTTP请求,服务器收到请求后会做出响应,称为HTTP响应

HTTP协议的请求

HTTP有两种常用的请求方式,它们分别是GET,POST。

  • GET:请求指定的页面消息,并返回实体主体。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的·建立或已有资源的修改。

GET和POST的区别

  1. GET提交的数据会放在URL之后,以“?”分隔URL和传输数据,参数以“&”相连,如EditPosts.aspx?name=text1&id=123456。POST是把提交的数据放在HTTP包的主体中。
  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST提交的数据没有限制。
  3. GET提交的数据会带来安全问题,比如一个登录页面,通过GET请求方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台服务器,就可以从历史记录获取该用户的用户名和密码。

使用httpURLConnection访问网络

1.url:包含请求地址的类

  • URL(path):包含请求路径的构造方法
  • openConnection():得到连接对象

2.HttpURLConnection:代表与服务器连接的类

  • requestMethod:设置请求方式,有GET和POST
  • requestTimeout:设置连接超时时间,单位为ms
  • readTimeout:设置读取服务器放回数据的时间
  • 断开连接():断开连接

3.HttpURLConnection的使用

在分线程,发送请求,得到响应数据

1.得到路径,创建URL对象。

val url=URL("https://www.baidu.com")

2.打开连接,得到HttpURLConnection对象

connection=url.openConnection() as HttpURLConnection

3.设置请求

GET:

connection.requestMethod="GET"

POST :

connection.requestMethod="POST"
val output=DataOutputStream(connection.outputStream)
output.writeBytes("username=admin&password=123456")

4.设置秒连接超时,读取数据超时

connection.connectTimeout=8000
connection.readTimeout=8000

5.得到InputStream,并读取成String

val input=connection.inputStream
val reader=BufferedReader(InputStreamReader(input))
reader.use {
        reader.forEachLine {
        response.append(it)
        }
}

6.断开连接

connection?.disconnect()

7.声明网络权限

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

4.练习

(要在有网络的模型机)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".HttpActivity">
    <Button
        android:id="@+id/sendRequestBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送请求"
        />
    <ProgressBar
        android:id="@+id/progress1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/responseText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </ScrollView>
</LinearLayout>
class HttpActivity : AppCompatActivity() {
    lateinit var send:Button
    lateinit var responseText:TextView
    lateinit var progressBar1:ProgressBar
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_http)
        send=findViewById(R.id.sendRequestBtn)
        responseText=findViewById(R.id.responseText)
        progressBar1=findViewById(R.id.progress1)
        progressBar1.visibility=View.INVISIBLE
        send.setOnClickListener {
            progressBar1.visibility=View.VISIBLE
            sendRequestWithHttpURLConnection()
        }
    }
    private fun sendRequestWithHttpURLConnection() {
        thread{
            var connection:HttpURLConnection?=null
            try {
                val response=StringBuilder()
                val url=URL("https://www.baidu.com")
                connection=url.openConnection() as HttpURLConnection
                connection.requestMethod="GET"
                connection.connectTimeout=8000
                connection.readTimeout=8000
                val input=connection.inputStream
                val reader=BufferedReader(InputStreamReader(input))
                reader.use {
                        reader.forEachLine {
                            response.append(it)
                        }
                    }
                showResponse(response.toString())
            }catch (e:Exception){
                e.printStackTrace()
            }finally {
                progressBar1.visibility=View.INVISIBLE
                connection?.disconnect()
            }
        }
    }
    private fun showResponse(response: String) {
        runOnUiThread {
            responseText.text=response
        }
    }
}
<uses-permission android:name="android.permission.INTERNET" />

使用OkHttp访问网络

OkHttp不仅在接口封装上做得简单易用,就连在底层实现上也是自成一派,比起HttpURLConnection有过之而无不及。

OkHttp的使用步骤:

1.添加OkHttp库的依赖

implementation 'com.squareup.okhttp3:okhttp:4.1.0'

2.创建OkHttpClient的实例

val client=OkHttpClient()

3.创建Request对象

GET:

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

POST:

val requestBody=FormBody.Builder()
                    .add("username","admin")
                    .add("password","123456")
                    .build()
val request=Request.Builder()
                    .url("https://www.baidu.com")
                    .post(requestBody)
                    .build()

4.创建Call对象,发送请求

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

5.得到服务器返回的数据

val responseData=response.body?.string()

简单的实例:

private fun sendRequestWithokHttp() {
        thread {
            try {
                val client=OkHttpClient()
                val request=Request.Builder()
                    .url("https://www.baidu.com")
                    .build()
                val response=client.newCall(request).execute()
                val responseData=response.body?.string()
                if(responseData!=null) {
                    showResponse(responseData)
                }
            }
            catch (e:Exception){
                e.printStackTrace()
            }
        }
    }
目录
相关文章
|
11月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
592 82
|
9月前
|
安全 Linux 定位技术
Curl访问Kerberos SPNEGO保护的HTTP资源
最后,记住,虽然Kerberos的魔法强大且久经考验,但它仍需你谨慎掌握。SPNEGO的舞步看似复杂,但一旦跳起来,你会发现自己在安全和便捷的旋律中翩翩起舞。而Curl,这一灵活敏捷的小工具,它的确有能力成为你施展这些魔法的得力助手。
271 14
|
10月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
544 26
|
9月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
407 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
12月前
|
API 数据处理 Android开发
Android网络请求演变:从Retrofit到Flow的转变过程。
通过这个比喻,我们解释了 Android 网络请求从 Retrofit 到 Flow 的转变过程。这不仅是技术升级的体现,更是反映出开发者在面对并发编程问题时,持续探索和迭求更好地解决方案的精神。未来,还会有更多新的技术和工具出现,我们期待一同 witness 这一切的发展。
406 36
|
10月前
|
Web App开发 缓存 JavaScript
Android网络小说阅读器的实现
小说阅读Demo,。此Demo使用Jsoup解析HTML,实现小说数据抓取(数据源自网络),并包含自定义View、六章小说缓存等功能,但未实现下载。项目还包括屏幕适配、字体设置等,借助第三方框架完成优化。以下是主页、详情页、阅读页等界面展示。
312 0
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
466 15
探寻HTTP代理IP访问站点失败的背后因素
随着互联网发展,使用HTTP动态代理IP的人越来越多。但有时使用代理后仍无法访问站点,原因包括:1. IP失效;2. 网络质量差;3. 浏览器或程序设置错误;4. 需尝试其他代理商;5. 联系网站管理员;6. 不符合目标站点规范。选择高质量的代理服务商可提升访问成功率。
347 2
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
4734 8
|
Java Kotlin
Kotlin学习教程(七)
《Kotlin学习教程(七)》主要介绍了Lambda表达式,这是一种匿名函数,广泛用于简化代码。文章通过与Java 8 Lambda表达式的对比,展示了Kotlin中Lambda的基本语法、参数声明、函数体定义及如何作为参数传递。示例包括按钮事件处理和字符串比较,突出了Lambda表达式的简洁性和实用性。
155 4

热门文章

最新文章