LoginSignup
48

More than 5 years have passed since last update.

KotlinでHTTP通信(FuelとHttpURLConnection)

Last updated at Posted at 2017-12-08

検証環境

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

  • 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とは

Fuelとは、KotlinとAndroid用のHTTP通信ライブラリーです。
HTTP通信が基本的な機能ですが、GSONと連携などが行え、JSONの解析が用意に行えたりもします。

準備

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


repositories {
    jcenter()
}

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48