見出し画像

Androidアプリ開発入門 (10) - OkHttp

「OkHttp」の使い方をまとめました。

・API 29: Android 10 (Q)
・OkHttp 4.9.0

前回

1. OkHttp

OkHttp」は、シンプルで効率的なHTTPクライアントです。

2. OkHttpのインストール

モジュールのbuild.gradleに以下を追加します。

implementation  "com.squareup.okhttp3:okhttp:4.8.0"

3. AndroidManifest.xml

◎ android.permission.INTERNET
通信を行うので、以下のパーミッションを追加します。

<uses-permission android:name="android.permission.INTERNET" />

◎ cleartextTrafficPermitted
「Android P」から、暗号化されていない(HTTPSでない)HTTP通信が、デフォルトで制限されています。動作確認のためHTTP通信を行いたい場合は、applicationタグにcleartextTrafficPermitted="true"を追加します。

    <application
        android:usesCleartextTraffic="true"

4. GETのHTTP通信

GETによるHTTP通信のコードは、次のとおりです。

// GETのリクエストの生成
val request = Request.Builder()
    .url("http://192.168.11.5/login?username=hoge&password=1234")
    .build()

// GETによるHTTP通信
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
    // 成功時に呼ばれる
    override fun onResponse(call: Call, response: Response) {
        Log.d("debug", response.body!!.string())
    }

    // 失敗時に呼ばれる
    override fun onFailure(call: Call, e: IOException) {
       Log.d("debug", e.toString())
    }
})


動作確認用のFlaskサーバーのコードは、次のとおりです。

from flask import Flask
from flask import request
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'
 
@app.route('/login', methods=['GET'])
def login():
    result = ''
    if request.method == 'GET':
        result += 'GET, '
        result += 'username:'+request.args.get('username', '')+', '
        result += 'password:'+request.args.get('password', '')+', '
    return result

if __name__ == "__main__":
    app.run(debug=False, host='0.0.0.0', port=80)

5. POSTのHTTP通信

POSTによるHTTP通信のコードは、次のとおりです。

// POSTのリクエストの生成
val body = FormBody.Builder()
    .add("username", "hoge")
    .add("password", "1234")
    .build()
val request = Request.Builder()
    .url("http://192.168.11.5/login")
    .post(body)
    .build()

// POSTによるHTTP通信
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
    // 成功時に呼ばれる
    override fun onResponse(call: Call, response: Response) {
        Log.d("debug", response.body!!.string())
    }

    // 失敗時に呼ばれる
    override fun onFailure(call: Call, e: IOException) {
       Log.d("debug", e.toString())
    }
})


動作確認用のFlaskサーバーのコードは、次のとおりです。

from flask import Flask
from flask import request
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'
  
@app.route('/login', methods=['POST'])
def login():
    result = ''
    if request.method == 'POST':
        result += 'POST, '
        result += str(request.get_data())
    return result

if __name__ == "__main__":
    app.run(debug=False, host='0.0.0.0', port=80)

【おまけ】 URLエンコードとURLデコード

val plainText = "これはテストです"

// URLエンコード
val encodeText = URLEncoder.encode(plainText, "UTF-8")
Log.d("debug","encodeText: "+encodeText)

// URLデコード
val decodeText = URLDecoder.decode(encodeText, "UTF-8")
Log.d("debug","decodeText: "+decodeText)

次回



この記事が気に入ったらサポートをしてみませんか?