メモ > 技術 > サービス: AmazonSNS > アプリからHTTPリクエストする例
アプリからHTTPリクエストする例
ここまでの例では、デバイストークンをPHPに渡すために手動での作業が必要となっている。
ただし実際のアプリでは、アプリからHTTPリクエストでPHPに渡すことになる。
以下、アプリからHTTPリクエストする例。
■PHP
test.php
<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode(array(
'status' => 'OK',
'datetime' => date('Y/m/d H:i:s'),
));
exit;
■Android(Kotlin)
※「OkHttp」を使うといいかもしれない。以下に検証メモがある。
Dropbox\技術\AndroidStudio.txt
※以下は「OkHttp」を使わずに実装する例。
Kotlin: HTTP GET/POST サンプルコード(AsyncTask) | UBUNIFU INCORPORATED
https://jp.ubunifu.co/development/kotlin-http-get-post-sample-code
[Android] 非同期処理 AsyncTaskの使い方
https://akira-watson.com/android/asynctask.html
[android開発] AndroidManifest.xmlの設定一覧(ネットワーク系) - 行け!偏差値40プログラマー
http://hensa40.cutegirl.jp/archives/6501
まずは汎用HTTPリクエストクラスを作成する。
MainActivity.kt と同じ階層に HttpTask.kt を作成して以下を記述。
パッケージ名はプロジェクトに合わせて調整する。
package net.refirio.pushtest1
import android.os.AsyncTask
import android.util.Log
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
class HttpTask(callback: (String?) -> Unit) : AsyncTask<String, Unit, String>() {
var callback = callback
override fun doInBackground(vararg params: String): String? {
val url = URL(params[1])
val httpClient = url.openConnection() as HttpURLConnection
httpClient.setReadTimeout(10 * 1000)
httpClient.setConnectTimeout(10 * 1000)
httpClient.requestMethod = params[0]
if (params[0] == "POST") {
httpClient.instanceFollowRedirects = false
httpClient.doOutput = true
httpClient.doInput = true
httpClient.useCaches = false
httpClient.setRequestProperty("Content-Type", "application/json; charset=utf-8")
}
try {
if (params[0] == "POST") {
httpClient.connect()
val os = httpClient.getOutputStream()
val writer = BufferedWriter(OutputStreamWriter(os, "UTF-8"))
writer.write(params[2])
writer.flush()
writer.close()
os.close()
}
if (httpClient.responseCode == HttpURLConnection.HTTP_OK) {
val stream = BufferedInputStream(httpClient.inputStream)
val data: String = readStream(inputStream = stream)
return data
} else {
Log.d("HttpTask", "ERROR: ${httpClient.responseCode}")
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
httpClient.disconnect()
}
return null
}
fun readStream(inputStream: BufferedInputStream): String {
val bufferedReader = BufferedReader(InputStreamReader(inputStream))
val stringBuilder = StringBuilder()
bufferedReader.forEachLine { stringBuilder.append(it) }
return stringBuilder.toString()
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
callback(result)
}
}
MainActivity.kt の onCreate 内に以下を記述。
// HTTPリクエストのテスト
HttpTask({
if (it == null) {
Log.d("MainActivity", "Data is empty.")
return@HttpTask
}
Log.d("MainActivity", "OK: ${it}")
val json = JSONObject(it)
val status = json.getString("status")
val datetime = json.getString("datetime")
Log.d("MainActivity", "status: ${status}")
Log.d("MainActivity", "datetime: ${datetime}")
}).execute("GET", "https://example.com/test.php")
インターネットにアクセスするため、AndroidManifest.xml に以下を追加。
「<manifest>」の直下に追加すればいい。
<uses-permission android:name="android.permission.INTERNET" />
■iOS(Swift)
ViewController.swift の viewDidLoad 内に以下を記述。
// HTTPリクエストのテスト
if let url = URL(string: "https://example.com/test.php") {
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request, completionHandler: {
(data: Data?, response: URLResponse?, error: Error?) in
guard let data = data else {
print("Data is empty.")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
if let status = (json as AnyObject).object(forKey: "status") {
print(status)
}
if let datetime = (json as AnyObject).object(forKey: "datetime") {
print(datetime)
}
} catch {
print("JSON parse error.")
}
print("Complete.")
})
task.resume()
}