Kotlinネットワークプログラミング(5)インターネットリソースへのアクセス

6326 ワード

  • URLの概念
  • HTTP/HTTPSプロトコル
  • URL類を使用する
  • HttpURLConnectionを使ってGET要求を送信する
  • POST要求をHttpURLConnectionで送信する
  • 例:Downloaderダウンロードプログラム
  •   KtlinはJavaのjava.net.URLクラスを使ってハイレベルのネットワークプログラムを行い、URL類を通じてインターネットリソースにアクセスすることができます.URLを使ってネットワークプログラミングをするのは、プロトコル自体を掉う必要がありません.相対的に简単です.
    一、URLの概念
      インターネットリソースはURLで指定されています.URLはUniflom 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とである.SSLは40ビットのキーワードをRC 4ストリーム暗号化アルゴリズムとして使用しており、これは商業情報の暗号化に適切である.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) {
        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 protected]&type=JSON&action=query"
    
    fun main(args: Array) {
        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) {
        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", "[email protected]", "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) {
        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()
        }
    }