Kotlin
HTTP通信

KotlinでHTTP通信(FuelとHttpURLConnection)

検証環境

この記事の内容は、以下の環境で検証しました。

  • Intellij IDEA ULTIMATE 2017.2
  • Kotlin 1.1.61
  • Fuel 1.12.0
  • Java 1.8
  • Gradle Projectで作成

はじめに

昨今のAndroidアプリは、HTTP通信をよく行います。
AndroidアプリをKotlinで実装するのであれば、HTTP通信をの実装で、どのようなライブラリーが有効なのかを知っておく必要があります。
Javaで開発していた時はOkHttpで十分なのですが、OkHttpはKotlinに対応しておらずKotlinでは扱いにくい状態です。Kotlinの公式サイトを確認してみると、HTTP通信ライブラリーを紹介しているので、せめて紹介されているライブラリーは確認したくて本記事を書きました。
(参考:https://kotlinlang.org/docs/resources.html

目標

FuelライブラリーとJavaのHttpURLConnectionで同じ処理を記述し、実装の違いを確認する。

Fuel

Fuelとは

https://github.com/kittinunf/Fuel

Fuelとは、KotlinとAndroid用のHTTP通信ライブラリーです。
HTTP通信が主な機能ですが、GSONと連携などが行えます。

準備

Fuelを使用するため、Gradleに以下の1行を追記します。

    compile 'com.github.kittinunf.fuel:fuel:1.12.0'

実装例

実際にFuelを使用した例は、以下の通りです。

package jp.co.casareal.fuel

import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.result.Result

fun main(args: Array<String>) {

    // 非同期処理
    "https://www.casareal.co.jp/".httpGet().response { request, response, result ->
        when (result) {
            is Result.Success -> {
                // レスポンスボディを表示
                println("非同期処理の結果:" + String(response.data))
            }
            is Result.Failure -> {
                println("通信に失敗しました。")
            }
        }
    }

    // 同期処理
    val triple = "https://www.casareal.co.jp/".httpGet().response()
    // レスポンスボディを表示
    println("同期処理の結果:" + String(triple.second.data))
}

解説

Fuelを使用するには、下記の形式で記述します。

"URLを記述".httpXXX().response関数 or responseString関数
  • httpXXXには、GetやPostなどのHTTPメソッドを記述します。
  • response関数やresponseString関数の引数にラムダ式を記述すると、非同期処理になります。
  • response関数やresponseString関数の引数にラムダ式を記述しないと、同期処理になります。

HTTP通信の結果によって処理を分ける場合は、以下の形式で記述します。

  when (result) {
            is Result.Success -> {
                // レスポンスボディを表示
                println("非同期処理の結果:" + String(response.data))
            }
            is Result.Failure -> {
                println("通信に失敗しました。")
            }
        }
  • HTTP通信の結果は、resultに格納されています。
  • HTTP通信が正常に行えると、resultにはSuccessが格納されています。
  • HTTP通信が正常に行えないと、resultにはFailureが格納されています。

HttpURLConnection

HttpURLConnectionとは

HttpURLConnectionとは、Javaが提供しているクラスの1つです。HTTP 固有の機能をサポートするしているクラスです。
詳細:https://docs.oracle.com/javase/jp/6/api/java/net/HttpURLConnection.html

実装例

HttpURLConnectionクラスを使用した実装例は、以下の通りです。
通信部分の処理は、関数化しています。

package jp.co.casareal.fuel

import java.net.HttpURLConnection
import java.net.URL
import jdk.nashorn.internal.runtime.ScriptingFunctions.readLine
import java.io.InputStreamReader
import java.io.BufferedReader
import java.lang.Exception


fun main(args: Array<String>) {

    // 非同期処理
    val thread = Thread() {
        println("非同期処理の結果:${connectionCasareal()}")
    }.start()

    // 同期処理
    val result = connectionCasareal()
    println("同期処理の結果:${result}")
}

fun connectionCasareal(): String {
    val requestUrl = "https://www.casareal.co.jp/"

    //  URLオブジェクトを生成
    val url = URL(requestUrl)

    val urlConnection = url.openConnection() as HttpURLConnection

    urlConnection.requestMethod = "GET"

    urlConnection.connect()


    val br = BufferedReader(InputStreamReader(urlConnection.inputStream))

    var line: String? = null
    val sb = StringBuilder()

    for (line in br.readLines()) {
        line?.let { sb.append(line) }
    }

    br.close()

    return sb.toString()

}

まとめ

百聞は一見に如かずではないですが、Fuelを使用することにより、コードがシンプルになり可読性が向上しています。

次回は・・・

FuelとGSONの連携について書きたいと思っています。