Restful API (flask)
Flask

Restful API (flask)

 

OKHTTP란?

OKHTTP는 안드로이드에서 서버와 통신을 할수 있게 해주는 오픈소스 입니다.

OKHTTP공식홈페이지

공식 홈페이지에 나와있는 내용을 기반으로 진행될것이다.

홈페이지에 있는 내용을 이해하기 위해서 먼저 꼭 알아야할 내용이 있다.

REST API란?

일종에 URL을 만들때의 규칙이다. 정말 자세한 내용은 아래 REST_API를 클릭하면 볼수 있다.

이중 우선 꼭 알아야하는 GET, POST, PUT, DELETE에 대해서 알아보자.

  • REST API
종류 한마디로 역할
GET show 어떤 변수의 값을 실어 보내 요청하면, 거기에 해당하는 내용을 db에서 찾아서 보여줌
POST create 어떤 등록하고 싶은 내용을 실어 보내면, 그 내용을 db에 등록해줌
PUT update 어떤 변수의 값과, 그 변수에 해당하는 내용중 바꾸고 싶은 내용을 보내면 그 내용으로 db가 업데이트됨
DELETE remove 어떤 변수의 값을 실어 보내 그 변수에 해당하는 내용을 db에서 삭제함

REST_API

JSON란?

간단히 생각하면 배열이나 딕셔너리같은 자료형이다. 주로 정보를 저장하기 위해 사용된다.

{
"이름" : "홍길동",
"나이" : 22,
"특기" : ["배구", "야구"]
}

이런식으로 저장된 json파일의 경우, 이 파일에 접근해'이름'을 통해 홍길동을 얻을수 있다.

자 이제 기본적으로 공식 문서를 이해하기 위한 준비가 끝났다. 이제 공식 문서의 코드를 살펴보자.

GET URL

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

GET은 앞에서 배운것에 의하면, **어떤 변수의 값을 실어보내, 거기에 해당하는 내용을 db에서 찾아보는 역할**을 한다고 했다.

  • 먼저 변수를 요청할 Client 객체를 만든다. 그리고 run이라는 함수 안에 보면 request를 어디에 어떻게 할지 저의해준다.
  • url이 바로 어디로 변수를 보내는지 이고, 이 url에 해당하는 정보를 받을수 있다. 간단하게 생각하면, 어딘가로 내가 필요한 정보를 주세요 라고 요청하는 과정이다.
  • client.newCall(request).execute()을 통해 요청하고,
  • 그 요청의 결과는 response.body()에 담겨져서 온다.

POST URL

public static final MediaType JSON
    = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

POST는 앞에서 배운것에 의하면, **어떤 등록하고 싶은 내용을 실어 보내면, 그 내용을 db에 등록해줌**이라고 했다.

  • 위와 비슷하게, 요청할 client 객체를 하나 만들어준다.
  • 그리고 이번에는 어떤 등록하고 싶은 내용을 담아야한다. 이 내용은 json이라는 자료구조 형태로 만들어서 RequestBody.create에 넣어주고, 등록하고싶은 내용을 바디에 담아준다.
  • 이제 request.builder로 어디로, 어떤 정보를 담아 보낼지 결정한다.
  • client.newCall(request).execute()을 통해 요청하고,
  • 그 요청의 결과는 response.body()에 담겨져서 온다.

이렇게 보면 사실 아주 간단한데, 많은 사람들이 사전지식이 부족해 서버 연결에 실패하고 겁을 먹고는 한다.

이제 한번 실습을 해보자.

  1. 먼저 첫번째로는 안드로이드 스튜디오를 키고, 프로젝트를 하나 생성해준다. 실행시키면 helloworld가 나올것이다.
  2. Manifest 파일에 아래 코드를 추가해 준다.

⬇ 추가! ⬇

<uses-permission android:name="android.permission.INTERNET"/>
internet_permission

3.build.gradle(Module:app)파일에 아래 두라인을 복사해서 추가 한다.

⬇ 추가! ⬇

implementation("com.squareup.okhttp3:okhttp:4.8.0")
testImplementation("com.squareup.okhttp3:mockwebserver:4.8.0")
library

저장하고 sync now 누르기. OKHTTP 라이브러리를 추가해주는 과정이다.

4.이제 서버와 통신할 수 있는 코드를 안드로이드 스튜디오에 OKHTTP를 이용해서 짜보자. 아래의 코드를 복사해서 자바에 붙인다. 빨간줄이 잔뜩 뜨면, 거기에 마우스를 대고 옵션+앤터를 누르면 빨간줄이 사라지는걸 볼수 있다. import를 하지 않아서 인데, 안스는 옵션+엔터로 자동으로 추가해준다.

⬇ 추가! ⬇

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    private static final String urls = "http://0.0.0.0:60000/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendServer();
    }


    public void sendServer(){
        class sendData extends AsyncTask<Void, Void, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
            }

            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled(String s) {
                super.onCancelled(s);
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();
            }

            @Override
            protected String doInBackground(Void... voids) {

                try {
                    OkHttpClient client = new OkHttpClient();
                    JSONObject jsonInput = new JSONObject();
                    jsonInput.put("creator_email",  "21800007@handong.edu");
                    jsonInput.put("creator_name",  "yebin.kang");

                    RequestBody reqBody = RequestBody.create(
                            MediaType.parse("application/json; charset=utf-8"),
                            jsonInput.toString()
                    );

                    Request request = new Request.Builder()
                            .post(reqBody)
                            .url(urls)
                            .build();

                    Response responses = null;
                    responses = client.newCall(request).execute();
                    System.out.println(responses.body().string());

                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
        sendData sendData = new sendData();
        sendData.execute();
    }

}

5.이제 간단한 코드를 테스트 하기 위해, 아주 아주 간단한 flask 로컬 서버를 하나 열어준다.

먼저 pip, virtualenv, flask는 기본적으로 설치 되어 있어야 한다. 없다면 아래 블로그들에서 설치부터 하자.

플라스크설치

플라스크더공부하기

설치가 끝났다면 바탕화면에 flask라는 폴더를 만들고 그 폴더로 들어가 아래 명령어를 실행하자.

⬇ 추가! ⬇

$ cd flask
$ virtualenv --python=python3 venv
$ source venv/bin/activate

이제 flask 폴더안에 app.py를 만들고, 아래 코드를 추가해준다.

⬇ 추가! ⬇

from flask import Flask, make_response, jsonify, request
app = Flask(__name__)


@app.route('/')
def hello():
    data = request.get_json()
    print(data)
    return jsonify({'data': data})


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=60000)

⬇ 실행 ⬇

python app.py

 

 

 

6.이제 서버를 켰으니 안드로이드 스튜디오에서 우리가 만든 코드를 한번 테스트해보자.

다시 프로젝트를 실행시킨다. 그리고 실행버튼을 눌러보자.

서버를 보면 서버에 무언가 도착한것을 볼수 있다. 아마 json파일 정보가 print되게 되어 있을 것이다.

안드로이드 스튜디오 터미널에도 보면, 무언가 도착해져 있다.

data로 방금 보낸 내용을 json화 된 결과값을 볼수 있다.

결론:

지금 우리가 해본것은 안드로이드 스튜디오에서 내 이메일과 이름을 파이썬 로컬 플라스크 서버로 보내고, 플라스크 서버에서 받은 값을 프린트 해보고, data:<받은것> 형태로 다시 돌려보내주면, 그 값을 안드로이드 스튜디오에서 프린트 해보았다

이걸 응용하면, 현실에서는.. 안드로이드 스튜디오에서 어떤 특정한 사용자 아이디를 서버에 보내면, 서버는 데이타 베이스에서 그 사용자 아이디에 해당하는 테이블을 찾고, 그 사용자 정보를 받아서 그 값을 안드로이드 스튜디오에 돌려주고, 그 정보를 이용해 어플을 이용하는 사용자에게 띄울수 있겠죠?

 

'Flask' 카테고리의 다른 글

Flask Marshmellow 라이브러리 이용하기  (0) 2021.05.11
Flask ORM  (0) 2021.05.11
플라스크 기본 연습용 프로젝트  (0) 2021.05.11
Flask 로 서버 연동 체크  (0) 2020.07.21