質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

921閲覧

androidエミュレーターからローカルサーバーAPIへの接続方法

tomaa

総合スコア84

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/10/07 10:02

編集2020/10/07 10:05

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/10/07 11:47

> D / NetworkSecurityConfig:プラットフォームのデフォルトを使用して、ネットワークセキュリティ構成が指定されていません 接続先にjavaを使用しないで接続できるか確認(ファイアーウォール等)されましたか? あとこんなにIPとか盛大にさらして大丈夫?
tomaa

2020/10/07 14:00 編集

コメントありがとうございます。 D / NetworkSecurityConfig:〜の対策として ①android:usesCleartextTraffic="true" ②android:name="android.permission.ACCESS_NETWORK_STATE" ③android:networkSecurityConfig="@xml/network_security_config" を、AndroidManifest.xmlに加えると、 メッセージが、 `D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true` となりました。 参照元:https://stackoverflow.com/questions/53984725/networksecurityconfig-no-network-security-config-specified-using-platform-defa/53984915#53984915 しかし、 java.net.ConnectException: Failed to connect to /127.0.0.1:8000は、依然解決できていません。 接続先にjavaを使用しないで接続できるか確認はしています。
tomaa

2020/10/07 14:06

なるほど、「接続先にjavaを使用しないで接続できるか確認(ファイアーウォール等)」 の意味を間違えていました。 ご助言ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問