2018.4.25
キモヲタだけど、女子高生と会話したい!#12【Volley】
んじゃ、APIの仲介業者を書きますかね。っていうか、APIを書くわけですけれども。
実装するものとしては・・・・・・
1.音声解析されたメッセージを受け取り、LINEで送信させる関数
2.りんなちゃんからの応答(Botアカウントへのレスポンス)を受け取り、JSONでスマホ側に返却する関数
3.1と2を呼び出し、「Stringを与えればりんなちゃんの応答がStringで返ってくる」というAPI
を実装することになりますね。音声合成は通信容量の問題でスマホ側でやってもらいます。
ではまず最初に、エミュからStringを飛ばしてreturn方法を考えますかね。
単に、純粋なAPIだと勝手にアクセスされるので、ハードコーディングでパスワードを同時に送信しPHP側でチェック、という簡易的なセキュリティも付与しますかね。これが一番実装が簡単そうですし。ログインとか実装するのやってられませんし笑
どうやって通信するのかなと探したところ、
Volleyというライブラリを使うそうです。Googleお手製で最高速度を謳っております。まぁ通信できればなんでもいいです。
gradleにぶっ込めば使えるようになるみたいですね。かんたん。
で、このVolleyを使って自作のAPIと通信する際に2日ほどハマってるので、今回はその部分の備忘録を・・・・・・。
protected fun sendAjax(str:String){
//Queueを初期化
var mQueue = Volley.newRequestQueue(this)
var jsonobj = JSONObject()
try {
jsonobj.put("string",str)
jsonobj.put("password","abcdefg")
} catch (ex:JSONException) {
findViewById<TextView>(R.id.result).setText("Error Occurred while building JSON")
ex.printStackTrace()
}
//findViewById<TextView>(R.id.result).setText("in sendAjax!:::"+jsonRequest.toString())
//キューにリクエストを追加
mQueue.add(JsonObjectRequest(Request.Method.POST, url, jsonobj, object : Response.Listener<JSONObject> {
override fun onResponse(response: JSONObject) {
findViewById<TextView>(R.id.result).setText("in sendAjax! - "+str+" - finish!")
// JSONObjectのパース、List、Viewへの追加等
var result= mutableMapOf<String,String>(
"result" to response.getString("result"),
)
displayResultExe(result.get("result"))
}
},
Response.ErrorListener {
findViewById<TextView>(R.id.result).setText("なんらかのエラー...")
// エラー処理 error.networkResponseで確認
// エラー表示など
}))
}
最終的に出来上がったコードはこちらです。
で、API側ですが・・・・・・
$inp = json_decode(file_get_contents('php://input'));
echo json_encode(["result"=>$inp->string]);
まぁこんな感じです。日記用に要らない部分を削った後テストしてないのでもしかしたら動かないかも知れないですけど、雰囲気はこんな感じです(笑)
とりあえずコツとしては
php://inputの部分です。理由は不明ですが、$_POSTとか$_GETからはデータ取れないです。
ただ、php://inputから流れてくるjsonオブジェクトをデコードするとオブジェクトが返ってくるので、そこからフィールド変数を取り出す、みたいな感じの実装になるみたいですね。
つまり、オブジェクトがそのまま流れてくる感じになるんですかね。ほんとどういう実装されてるんだろうね。
ということで、サーバーとのデータのやり取りができるようになったので、次回からサーバーサイドの実装、つまりLINEのりんなちゃんとのコンタクトを図ります(笑)
あーほんとですね(笑)修正しました・・・・・・笑
書き置きしてたファイルがサーバーに残っちゃってて、何らかの事情で上書きされてなかったみたいですね・・・・・・僕もびっくりしました笑