前提・実現したいこと
androidエミュレーターより、ローカルサーバー内のdjango-rest-frameworkを利用して設定したAPIの値を取得したいです。
バックエンド(django-rest-framework)のローカルサーバーを立ち上げ、エミュレーターを起動し、対象のURLへ接続すると下記のエラーが発生します。
発生している問題・エラーメッセージ
2020-10-07 16:15:56.213 26141-26141/com.sample.apitest I/System.out: checked 2020-10-07 16:15:56.226 26141-26168/com.sample.apitest D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2020-10-07 16:15:56.233 26141-26168/com.sample.apitest W/System.err: java.net.ConnectException: Failed to connect to /127.0.0.1:8000 2020-10-07 16:15:56.233 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143) 2020-10-07 16:15:56.233 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112) 2020-10-07 16:15:56.233 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127) 2020-10-07 16:15:56.234 26141-26168/com.sample.apitest W/System.err: at com.sample.apitest.MainActivity$HitAPITask.doInBackground(MainActivity.kt:48) 2020-10-07 16:15:56.235 26141-26168/com.sample.apitest W/System.err: at com.sample.apitest.MainActivity$HitAPITask.doInBackground(MainActivity.kt:38) 2020-10-07 16:15:56.235 26141-26168/com.sample.apitest W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333) 2020-10-07 16:15:56.235 26141-26168/com.sample.apitest W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266) 2020-10-07 16:15:56.235 26141-26168/com.sample.apitest W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 2020-10-07 16:15:56.236 26141-26168/com.sample.apitest W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 2020-10-07 16:15:56.236 26141-26168/com.sample.apitest W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 2020-10-07 16:15:56.236 26141-26168/com.sample.apitest W/System.err: at java.lang.Thread.run(Thread.java:764)
java.net.ConnectException: Failed to connect to /127.0.0.1:8000
のエラーメッセージを手がかりに対応策を調べると、ローカルサーバー(エミュレーター側)から、ローカルサーバー(バックエンド側)へアクセスしている事が原因となってるらしき解説があるので、こちらの回答を参考に、エミュレーターのProxyを下記の設定に変更しました。
その後、django-rest-frameworkのCORSの設定を、Proxyの変更に対応させ、再度動作の確認をしても同じエラーが発生してしまします。
解決方法をご存知の方おりましたら、ご教授いただけないでしょうか?
該当のソースコード
バックエンド(django-reat-framework)
project/settings.py
python
1INSTALLED_APPS = [ 2 'corsheaders', 3] 4 5MIDDLEWARE = [ 6 'corsheaders.middleware.CorsMiddleware', 7 'django.middleware.common.CommonMiddleware', 8] 9 10CORS_ORIGIN_WHITELIST = [ 11 'http://10.0.2.2:8000' 12]
api仕様
json
1 2GET:http://127.0.0.1:8000/api/name/ 3 4 { 5 "name": "myName.", 6 }
Android側
AndroidManifest.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.sample.apitest"> 4 5 <uses-permission 6 android:name="android.permission.INTERNET" /> 7 8 <application 9 10 android:usesCleartextTraffic="true" 11 12 android:allowBackup="true" 13 android:icon="@mipmap/ic_launcher" 14 android:label="@string/app_name" 15 android:roundIcon="@mipmap/ic_launcher_round" 16 android:supportsRtl="true" 17 android:theme="@style/AppTheme"> 18 <activity android:name=".MainActivity"> 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN"/> 21 22 <category android:name="android.intent.category.LAUNCHER"/> 23 </intent-filter> 24 </activity> 25 </application> 26 27</manifest>
MainActivity.kt
kotlin
1package com.sample.apitest 2 3import android.os.AsyncTask 4import android.support.v7.app.AppCompatActivity 5import android.os.Bundle 6import android.widget.Button 7import android.widget.TextView 8import org.json.JSONException 9import org.json.JSONObject 10import java.io.BufferedReader 11import java.io.IOException 12import java.io.InputStreamReader 13import java.net.HttpURLConnection 14import java.net.MalformedURLException 15import java.net.URL 16 17class MainActivity : AppCompatActivity() { 18 19 var name: TextView? = null 20 21 override fun onCreate(savedInstanceState: Bundle?) { 22 super.onCreate(savedInstanceState) 23 setContentView(R.layout.activity_main) 24 25 name = findViewById(R.id.textView) 26 val button = findViewById<Button>(R.id.button) 27 28 button.setOnClickListener { 29 println("checked") 30 HitAPITask().execute("http://127.0.0.1:8000/api/name/") 31 32 } 33 } 34 35 36 inner class HitAPITask : AsyncTask<String, String, String>() { 37 38 override fun doInBackground(vararg params: String?): String? { 39 var connection: HttpURLConnection? = null 40 var reader: BufferedReader? = null 41 val buffer: StringBuffer 42 43 try { 44 val url = URL(params[0]) 45 connection = url.openConnection() as HttpURLConnection 46 connection.connect() 47 48 val stream = connection.inputStream 49 reader = BufferedReader(InputStreamReader(stream)) 50 buffer = StringBuffer() 51 var line: String? 52 while (true) { 53 line = reader.readLine() 54 if (line == null) { 55 break 56 } 57 buffer.append(line) 58 } 59 60 var jsonText = buffer.toString() 61 62 val jsonObj = JSONObject(jsonText) 63 val plant_name: String = jsonObj.getString("name") 64 65 return plant_name 66 } catch (e: MalformedURLException) { 67 e.printStackTrace() 68 } catch (e: IOException) { 69 e.printStackTrace() 70 } catch (e: JSONException) { 71 e.printStackTrace() 72 } finally { 73 connection?.disconnect() 74 try { 75 reader?.close() 76 } catch (e: IOException) { 77 e.printStackTrace() 78 } 79 } 80 return null 81 } 82 83 override fun onPostExecute(result: String?) { 84 super.onPostExecute(result) 85 if (result == null) return 86 87 name!!.text = result 88 } 89 } 90 91}
補足情報(FW/ツールのバージョンなど)
androi-studio: 3.3.2
python: 3.7.5
django-cors-headers: 2.4.0
djangorestframework: 3.8.2
あなたの回答
tips
プレビュー