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と連携などが行え、JSONの解析が用意に行えたりもします。

## 準備
Fuelを使用するため、Gradleに以下を追記します。

```groovy

repositories {
    jcenter()
}

dependencies {
    compile 'com.github.kittinunf.fuel:fuel:1.12.0'
}

```

## 実装例

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

```kotlin
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を使用するには、下記の形式で記述します。

```kotlin
"URLを記述".httpXXX().response関数 or responseString関数
```

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

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

```kotlin
  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クラスを使用した実装例は、以下の通りです。
通信部分の処理は、関数化しています。

```kotlin
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の連携について書きたいと思っています。