[Android] kotlin과 node js를 이용한 http통신

메소드 : Get
Clinet -> Server로 요청하기 소스


1. 서버로 요청하여 응답받기


- MainActivity.kt
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import org.jetbrains.anko.AnkoComponent
import org.jetbrains.anko.AnkoContext
import java.io.BufferedReader
import java.net.HttpURLConnection
import java.io.InputStreamReader
import java.net.URL
 
import org.jetbrains.anko.*
import org.jetbrains.anko.sdk25.coroutines.onClick
 
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main);
        JSONTask().execute("http://192.168.0.182:3000")
    }
    class JSONTask : AsyncTask<String, String, String>() {
        override fun doInBackground(vararg params: String?): String? {
            // ...
            val url = params[0]
            val obj = URL(url)
            with(obj.openConnection() as HttpURLConnection) {
                // optional default is GET
                requestMethod = "GET"
                println("\nSending 'GET' request to URL : $url")
                println("Response Code : $responseCode")
                BufferedReader(InputStreamReader(inputStream)).use {
                    var response = it.readText()
                    println("response = "+response)
                    return response
                }
            }
            return null
        }
        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            println("결과 = "+result)
        }
    }
}

2. Anko를 이용하여 안드로이드 UI적용하기

- MainActivity.kt
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import org.jetbrains.anko.AnkoComponent
import org.jetbrains.anko.AnkoContext
import java.io.BufferedReader
import java.net.HttpURLConnection
import java.io.InputStreamReader
import java.net.URL

import org.jetbrains.anko.*
import org.jetbrains.anko.sdk25.coroutines.onClick

class MainActivity : AppCompatActivity() {
    private lateinit var name : EditText
    private lateinit var tView : TextView
    private lateinit var clickmeBtn : Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        createView()
        JSONTask().execute("http://192.168.0.182:3000")
    }
    fun createView() {
        verticalLayout {
            padding = dip(8)

            name = editText {
                hint = "Enter your name"
                textSize = 10f
            }
            tView = textView {
                textSize = 10f
            }

            clickmeBtn = button("Click me") {
                textSize = 10f
                onClick {
                    clickMeClick()
                }
            }
        }
    }
    fun clickMeClick() {
        tView.text=name.text
    }
    class JSONTask : AsyncTask<String, String, String>() {
        override fun doInBackground(vararg params: String?): String? {
            // ...
            val url = params[0]
            val obj = URL(url)
            with(obj.openConnection() as HttpURLConnection) {
                // optional default is GET
                requestMethod = "GET"
                println("\nSending 'GET' request to URL : $url")
                println("Response Code : $responseCode")
                BufferedReader(InputStreamReader(inputStream)).use {
                    var response = it.readText()
                    println("response = "+response)
                    return response
                }
            }
            return null
        }
        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            println("결과 = "+result)

        }
    }
}


Tip. JAVA를 이용해서 http통신하기

- MainActivity.kt
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private TextView tvData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvData = (TextView)findViewById(R.id.textView);
        Button btn = (Button)findViewById(R.id.httpTest);

        //버튼이 눌리면 아래 리스너가 수행된다.
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.out.println("Button click !! kotlin");
                //아래 링크를 파라미터를 넘겨준다는 의미.
                new JSONTask().execute("http://192.168.0.182:3000");
            }
        });

    }

    public class JSONTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... urls) {
            try {
                //JSONObject를 만들고 key value 형식으로 값을 저장해준다.
                JSONObject jsonObject = new JSONObject();
                jsonObject.accumulate("user_id", "androidTest");
                jsonObject.accumulate("name", "yun");

                HttpURLConnection con = null;
                BufferedReader reader = null;

                try{
                    //URL url = new URL("http://192.168.25.16:3000/users");
                    URL url = new URL(urls[0]);//url을 가져온다.
                    System.out.println(url+": address ");
                    con = (HttpURLConnection) url.openConnection();
                    con.connect();//연결 수행

                    //입력 스트림 생성
                    InputStream stream = con.getInputStream();

                    //속도를 향상시키고 부하를 줄이기 위한 버퍼를 선언한다.
                    reader = new BufferedReader(new InputStreamReader(stream));

                    //실제 데이터를 받는곳
                    StringBuffer buffer = new StringBuffer();

                    //line별 스트링을 받기 위한 temp 변수
                    String line = "";

                    //아래라인은 실제 reader에서 데이터를 가져오는 부분이다. 즉 node.js서버로부터 데이터를 가져온다.
                    while((line = reader.readLine()) != null){
                        buffer.append(line);
                    }

                    //다 가져오면 String 형변환을 수행한다. 이유는 protected String doInBackground(String... urls) 니까
                    return buffer.toString();

                    //아래는 예외처리 부분이다.
                } catch (MalformedURLException e){
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    //종료가 되면 disconnect메소드를 호출한다.
                    if(con != null){
                        con.disconnect();
                    }
                    try {
                        //버퍼를 닫아준다.
                        if(reader != null){
                            reader.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }//finally 부분
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        //doInBackground메소드가 끝나면 여기로 와서 텍스트뷰의 값을 바꿔준다.
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            tvData.setText(result);
        }

    }
}

댓글

가장 많이 본 글