로컬 Flask 서버와 안드로이드 스튜디오 통신하기

로컬 Flask 서버와 안드로이드 스튜디오 통신하기

728x90

안드로이드 스튜디오 플라스크 서버와 통신하기

flask 서버를 0.0.0.0(열려있는) host로 돌린다

AndroidManifest.xml 의 태그 안

추가

android:usesCleartextTraffic="true" -> AndroidManifest.xml > 의 inline

http://10.0.2.2:5000/ -> URL 사용, 10.0.2.2 -> 에뮬레이터 개발자용 호스트

from flask import Flask, json, request app = Flask(__name__) @app.route("/") def index(): return "Hello Flask!" @app.route("/hello", methods=["GET", "POST"]) def hello(): return json.jsonify({"msg" : "Hello Android! - from Flask"}) accounts = [] @app.route("/login", methods = ["GET", "POST"]) def login(): id = request.form["id"] pw = request.form["pw"] accounts.append({"email" : "[email protected]", "id" : id, "pw" : pw}) print(accounts) return json.jsonify({"id" : id, "pw" : pw}) @app.route("/signin", methods=["GET", "POST"]) def signin(): email = request.form["email"] id = request.form["id"] pw = request.form["pw"] accounts.append({"email" : email, "id" : id, "pw" : pw}) print(accounts) return json.jsonify({"email" : email, "id" : id, "pw" : pw}) @app.route("/list", methods = ["GET", "POST"]) def list(): return json.jsonify(({"list" : [ {"email" : "[email protected]", "id" : "testId", "pw" : "testPw"}, ]})) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)

package com.kyh.httppractice; import androidx.appcompat.app.AppCompatActivity; import android.content.ContentValues; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.json.JSONException; import org.json.JSONObject; public class HelloAndroidActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hello_android); getSupportActionBar().setTitle("HelloAndroidActivity"); String url = "http://10.0.2.2:5000/hello"; NetworkTask networkTask = new NetworkTask(url, null); networkTask.execute(); ((Button)findViewById(R.id.nextBtn)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), LoginActivity.class); startActivity(intent); } }); } private class NetworkTask extends AsyncTask { private String url; private ContentValues values; public NetworkTask(String url, ContentValues values) { this.url = url; this.values = values; } @Override protected String doInBackground(Integer... integers) { String result; RequestHttpURLConnection requestHttpURLConnection = new RequestHttpURLConnection(); result = requestHttpURLConnection.request(url, values); return result; } @Override protected void onPostExecute(String json) { super.onPostExecute(json); JSONObject jsonObject = null; try { jsonObject = new JSONObject(json); ((TextView)findViewById(R.id.result)).setText(jsonObject.getString("msg")); } catch (JSONException e) { e.printStackTrace(); } } } }

package com.kyh.httppractice; import android.content.ContentValues; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import org.json.JSONException; import org.json.JSONObject; public class LoginActivity extends AppCompatActivity { EditText idInput, pwInput; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); getSupportActionBar().setTitle("LoginActivity"); idInput = (EditText) findViewById(R.id.idInput); pwInput = (EditText) findViewById(R.id.pwInput); String url = "http://10.0.2.2:5000/login"; ((Button)findViewById(R.id.submitBtn)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContentValues params = new ContentValues(); params.put("id", idInput.getText().toString()); params.put("pw", pwInput.getText().toString()); LoginActivity.NetworkTask networkTask = new LoginActivity.NetworkTask(url, params); networkTask.execute(); } }); ((Button)findViewById(R.id.nextBtn2)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), SignInActivity.class); startActivity(intent); } }); } private class NetworkTask extends AsyncTask { private String url; private ContentValues values; public NetworkTask(String url, ContentValues values) { this.url = url; this.values = values; } @Override protected String doInBackground(Integer... integers) { String result; // 요청 결과를 저장할 변수. RequestHttpURLConnection requestHttpURLConnection = new RequestHttpURLConnection(); result = requestHttpURLConnection.request(url, values); // 해당 URL로 부터 결과물을 얻어온다. return result; } @Override protected void onPostExecute(String json) { super.onPostExecute(json); JSONObject jsonObject = null; try { jsonObject = new JSONObject(json); //doInBackground()로 부터 리턴된 값이 onPostExecute()의 매개변수로 넘어오므로 s를 출력한다. ((TextView)findViewById(R.id.idResult)).setText(jsonObject.getString("id")); ((TextView)findViewById(R.id.pwResult)).setText(jsonObject.getString("pw")); } catch (JSONException e) { e.printStackTrace(); } } } }

package com.kyh.httppractice; import android.content.ContentValues; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import org.json.JSONException; import org.json.JSONObject; public class SignInActivity extends AppCompatActivity { TextView signInEmail, signInId, signInPw; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signin); getSupportActionBar().setTitle("SignInActivity"); signInEmail = (TextView) findViewById(R.id.signInEmail); signInId = (TextView) findViewById(R.id.signInId); signInPw = (TextView) findViewById(R.id.signInPw); String url = "http://10.0.2.2:5000/signin"; ((Button)findViewById(R.id.signInSubmit)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContentValues params = new ContentValues(); params.put("email", signInEmail.getText().toString()); params.put("id", signInId.getText().toString()); params.put("pw", signInPw.getText().toString()); NetworkTask networkTask = new NetworkTask(url, params); networkTask.execute(); } }); ((Button)findViewById(R.id.nextBtn3)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), ListActivity.class); startActivity(intent); } }); } private class NetworkTask extends AsyncTask { private String url; private ContentValues values; public NetworkTask(String url, ContentValues values) { this.url = url; this.values = values; } @Override protected String doInBackground(Integer... integers) { String result; // 요청 결과를 저장할 변수. RequestHttpURLConnection requestHttpURLConnection = new RequestHttpURLConnection(); result = requestHttpURLConnection.request(url, values); // 해당 URL로 부터 결과물을 얻어온다. return result; } @Override protected void onPostExecute(String json) { super.onPostExecute(json); JSONObject jsonObject = null; try { jsonObject = new JSONObject(json); //doInBackground()로 부터 리턴된 값이 onPostExecute()의 매개변수로 넘어오므로 s를 출력한다. ((TextView)findViewById(R.id.responseEmail)).setText(jsonObject.getString("email")); ((TextView)findViewById(R.id.responseId)).setText(jsonObject.getString("id")); ((TextView)findViewById(R.id.responsePw)).setText(jsonObject.getString("pw")); } catch (JSONException e) { e.printStackTrace(); } } } }

package com.kyh.httppractice; import android.content.ContentValues; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; public class RequestHttpURLConnection { public String request(String _url, ContentValues _params) { // HttpURLConnection 참조 변수. HttpURLConnection httpURLConnection = null; // URL 뒤에 붙여서 보낼 파라미터. StringBuffer sbParams = new StringBuffer(); // URL 뒤에 파라미터 붙이기 if (_params == null) sbParams.append(""); // 보낼 데이터가 있으면 파라미터를 채운다. else { // 파라미터가 2개 이상이면 파라미터 연결에 &가 필요하므로 스위칭할 변수 생성. boolean isAnd = _params.size() > 1 ? true : false; // 파라미터 키와 값. String key; String value; for (Map.Entry parameter :_params.valueSet()) { key = parameter.getKey(); value = parameter.getValue().toString(); // 파라미터가 두개 이상일때, 파라미터 사이에 &를 붙인다. if (isAnd) sbParams.append("&"); sbParams.append(key).append("=").append(value); } } // Web 데이터 불러오기 try { URL url = new URL(_url); httpURLConnection = (HttpURLConnection) url.openConnection(); // [2-1]. urlConn 설정. httpURLConnection.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST. httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8"); // Accept-Charset 설정. httpURLConnection.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;charset=UTF-8"); // [2-2]. parameter 전달 및 데이터 읽어오기. String strParams = sbParams.toString(); //sbParams에 정리한 파라미터들을 스트링으로 저장. 예)id=id1&pw;=123; OutputStream os = httpURLConnection.getOutputStream(); os.write(strParams.getBytes("UTF-8")); // 출력 스트림에 출력. os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행. os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제. // [2-3]. 연결 요청 확인. // 실패 시 null을 리턴하고 메서드를 종료. if (httpURLConnection.getResponseCode() != HttpURLConnection.HTTP_OK) return null; // [2-4]. 읽어온 결과물 리턴. // 요청한 URL의 출력물을 BufferedReader로 받는다. BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8")); // 출력물의 라인과 그 합에 대한 변수. String line; String page = ""; // 라인을 받아와 합친다. while ((line = reader.readLine()) != null) { page += line; } return page; } catch (MalformedURLException e) { // for URL. e.printStackTrace(); } catch (IOException e) { // for openConnection(). e.printStackTrace(); } finally { if (httpURLConnection != null) httpURLConnection.disconnect(); } return null; } }

728x90

from http://kanei-0415.tistory.com/104 by ccl(A) rewrite - 2021-05-28 07:00:30