diadia

興味があることをやってみる。自分のメモを残しておきます。

Djangoのアプリにrequestしてレスポンスを得る

djangoのrestapiを実装する

DRFをインストールする。
JSONのレスポンスを返す仕組みを構築する。とりあえずdjangoJSON形式でレスポンスを返す仕組みを構築する。

Http接続を行う

基本的にAsyncTaskクラスを使って、その中のdoInBackgroundメソッド内でhttp接続を行う。したがって"http接続を行うこと"="AsyncTaskクラスを利用すること"として結びつけることが開発の手助けになる。
djangoはデプロイした状態ではhttp(s)接続するのは容易だが、ローカルホストに接続するのはいくらか注意点がある。

  1. いつもどおりに127.0.0.1:8000を使ってhttp接続をしないこと
  2. djangoのsettings.pyのALLOWED_HOSTに"10.0.2.2"を加えるか、"*"を加えること

1に関しては、以下に資料がある。
https://stackoverflow.com/questions/57711124/how-to-connect-a-django-rest-framework-into-android-app-in-testing-environment
要するに、エミュレーターを使ってそこから127.0.0.1に接続することはエミュレーターの内部に接続してしまうことになる。python manage.py runserver を行ったローカルのPCに接続するには10.0.2.2に接続する必要がある。したがってurlの文字列は"http://10.0.2.2:8000/api/no/path"と記述しなければならない。
2に関しては、settings.pyのALLOWED_HOSTに10.0.2.2の内容を記述していないと、せっかくdjangoに接続してもdjangoのほうから接続を切られてしまう結果になる。ちなみにdjangoのターミナルでは以下のように表示されたらALLOWED_HOSTに追加する。

Invalid HTTP_HOST header: '10.0.2.2:8000'. You may need to add '10.0.2.2' to ALLOWED_HOSTS.
設計イメージ

ActivityMain.xmlにListViewを配置する。このListViewの要素をタップすると、次の画面に遷移する。次の画面はNextActivityと命名する。NextActivityに画面遷移したら、まずAcyncTaskクラスのdoInBackgroundメソッド(オーバーライド済み)が動く。このdoInBackgroundメソッド内でhttp(s)接続を行い、JSONレスポンスを取得する。doinBackgroundメソッドが終了したらonPostExecuteメソッドで取得したJSONレスポンスを画面遷移先に表示する。

JSONオブジェクトを解析する

val json_date = JSONObject(result)
//val item_object_count = json_data.getJSONObject("item_objects.count")
val item_object_count = json_data.getString("item_objects.count")
val tv_show = findViewById(R.id.TV_show)
tv_show.text = item_object_count

参考:https://teratail.com/questions/93023