Kotlin网络编程(5)访问互联网资源

  • URL 的概念
  • HTTP/HTTPS 协议
  • 使用 URL 类
  • 使用 HttpURLConnection 发送 GET 请求
  • 使用 HttpURLConnection 发送 POST 请求
  • 实例:Downloader 下载程序

  Kotlin 可以通过使用 Java 的 java.net.URL 类进行高层次网络编程,通过 URL 类访问互联网资源。使用 URL 进行网络编程不需要掉协议本身有太多的了解,相对而言是比较简单的。

一、URL 的概念

  互联网资源是通过 URL 指定的,URL 是 Uniform Resource Locator 的简称,翻译过来是 “一致资源定位器” ,但人们都习惯 URL 这个简称。

  • URL 组成格式如下:
协议名://资源名

  “协议名” 指明获取资源所使用的传输协议,如 http、ftp、gopher 和 file 等,“资源名” 则应该是资源的完整地址,包括主机名、端口号、文件名 或 文件内部的一个引用。

如:

http://www.baidu.com/
http://home.sohu.com/home/welcome.html
http://www.51work6.com:8800/Gamlan/network.html#BOTTOM

二、HTTP/HTTPS 协议

  互联网访问大多都是基于 HTTP/HTTPS 协议。

1、HTTP 协议

  HTTP 是 Hypertext Transfer Protocol 的缩写,即超文本传输协议。HTTP 是一个属于应用层的面向对象的协议,其简捷、快速的方式适用于分布式超文本信息的传输。HTTP 协议支持 C/S 网络结构,是无连接协议,即每一次请求时建立连接,服务器处理完客户端的请求后,应答给客户端然后断开连接,不会一直占用网络资源。

  HTTP/1.1 协议共定义了 8 种请求函数:OPTIONSHEADGETPOSTPUTDELETETRACECONNECT。在 HTTP 访问中,一般使用 GETPOST 函数。

  • GET 函数。向指定的资源发出请求,发送的信息 “显示” 的跟在 URL 后面。GET 函数应该只用在读取数据,例如静态图片等。GET 函数优点像使用明信片给别人写信,“信内容” 写在外面,接触到的人都可以看到,因此是不安全的。

  • POST 函数。向指定的资源提交数据,请求服务器进行处理,例如提交表单或者上传文件等。数据被包含在请求体中。POST 函数像是把 “信内容” 装入信封中,接触到的人都看不到,因此是安全的。

2、HTTPS 协议

  HTTPS 是 Hypertext Transfer Protocol Secure 的缩写,即超文本传输安全协议,是超文本传输协议 和 SSL 的组合,用以提供加密通信及对网络服务器身份的鉴定。

  简单地说,HTTPS 是 HTTP 的升级版,HTTPS 与 HTTP 的区别是:HTTPS 使用 https:// 代替 http://,HTTPS 使用端口 443,而 HTTP 使用端口 80 来与 TCP/IP 进行通信。SSL 使用 40 位关键字作为 RC4 流加密算法,这对于商业信息的加密是合适的。HTTPS 和 SSL 支持使用 X.509 数字认证,如果需要的话,用户可以确认发送者是谁。

三、使用 URL 类

  java.net.URL 类用于请求互联网上的资源,采用 HTTP/HTTPS 协议,请求函数是 GET 函数,一般是请求静态的、少量的服务器端数据。

URL 类常用的构造函数如下:

  • URL(spec: String!)。根据字符串表示形式创建 URL 对象。
  • URL(protocol: String!, host: String!, file: String!)。根据指定的协议名、主机名 和 文件名称创建 URL 对象。
  • URL(protocol: String!, host: String!, port: Int! file: String!)。根据指定的协议名、主机名、端口号 和 文件名称创建 URL 对象。

URL 类常用函数如下:

  • openStream()。打开到此 URL 的连接,并返回一个输入流 InputStream 对象。
  • openConnection()。打开到此 URL 的新连接,返回一个 URLConnection 对象。
fun main(args: Array<String>) {
    val url = "http://www.baidu.com"
    URL(url).openStream().use { input ->
        input.bufferedReader().forEachLine {
            println(it)
        }
    }
}

四、使用 HttpURLConnection 发送 GET 请求

  由于 URL 类只能发送 HTTP/HTTPS 的 GET 函数请求,如果想进行其他函数的操作时,可以使用 HttpURLConnection 类型。

private const val urlString = "http://www.51work6.com/service/mynotes/WebService.php" +
        "?email=fengxueyan@alipaycampus.com&type=JSON&action=query"

fun main(args: Array<String>) {
    var conn: HttpURLConnection? = null
    try {
        conn = URL(urlString).openConnection() as HttpURLConnection
        conn.connect()
        conn.inputStream.use { input ->
            val data = input.bufferedReader().readText()
            println(data)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        conn?.disconnect()
    }
}

// 返回数据
{
    "ResultCode": 0,
    "Record": [
        {
            "ID": 666,
            "CDate": "2017-05-18",
            "Content": "欢迎来到智捷课堂。"
        },
        {
            "ID": 666,
            "CDate": "2018-10-18",
            "Content": "Welcome to zhijieketang."
        }
    ]
}

五、使用 HttpURLConnection 发送 POST 请求

  HttpURLConnection 也可以发送 HTTP/HTTPS 的 POST 请求,下面是使用 HttpURLConnection 发送 POST 请求的案例。

private const val urlString = "http://www.51work6.com/service/mynotes/WebService.php"

fun main(args: Array<String>) {
    var conn: HttpURLConnection? = null
    try {
        conn = URL(urlString).openConnection() as HttpURLConnection
        conn.requestMethod = "POST" // 指定POST请求
        conn.doOutput = true // 设置请求过程可以传递参数给服务器

        // post请求参数
        val param = String.format("email=%s&type=%s&action=%s", "fengxueyan@alipaycampus.com", "JSON", "query")
        DataOutputStream(conn.outputStream).use { os ->
            os.writeBytes(param)
        }
        conn.connect()
        conn.inputStream.use { input ->
            val data = input.bufferedReader().readText()
            println(data)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        conn?.disconnect()
    }
}

// 返回数据
{
    "ResultCode": 0,
    "Record": [
        {
            "ID": 666,
            "CDate": "2017-05-18",
            "Content": "欢迎来到智捷课堂。"
        },
        {
            "ID": 666,
            "CDate": "2018-10-18",
            "Content": "Welcome to zhijieketang."
        }
    ]
}

六、实例:Downloader 下载程序

private const val urlString = "https://ss0.bdstatic.com/" +
        "5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"

fun main(args: Array<String>) {
    var conn: HttpURLConnection? = null
    try {
        conn = URL(urlString).openConnection() as HttpURLConnection
        conn.connect()
        conn.inputStream.use { input ->
            BufferedOutputStream(FileOutputStream("./download.png")).use { bos ->
                input.copyTo(bos)
            }
        }
        println("下载成功!")
    } catch (e: Exception) {
        e.printStackTrace()
        println("下载失败!")
    } finally {
        conn?.disconnect()
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,117评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,860评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,128评论 0 381
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,291评论 1 315
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,025评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,421评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,477评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,642评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,177评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,970评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,157评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,717评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,410评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,821评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,053评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,896评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,157评论 2 375

推荐阅读更多精彩内容