ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드스튜디오/JAVA] 서버와 POST통신하기(json으로 값 주고 받기)
    안드로이드 어플 개발 2024. 7. 8. 21:17

    프론트-> 서버로 json형식으로 값을 주지만 서버가 나한테 걍 String으로 값을 준다는 가정 하에 작성

    서버에게 받는 값은 result에 받아서 textview2에 띄움

     

     

    엑셈엘

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:id="@+id/Sample_LinearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <LinearLayout
                android:layout_marginTop="15dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
    
                <EditText
                    android:id="@+id/dataText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:inputType="textPersonName"
                    android:hint="Name" />
    
                <Button
                    android:id="@+id/sendDataBtn"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:onClick="btn_Click"
                    android:text="Button" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
                <TextView
                    android:id="@+id/textView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="TextView" />
                <TextView
                    android:text="좀 떠라 ㅅㅂ"
                    android:id="@+id/responseView"
                    android:layout_marginTop="15dp"
                    android:layout_width="match_parent"
                    android:textSize="25sp"
                    android:layout_height="wrap_content"/>
            </LinearLayout>
        </LinearLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>

    메인 액티비티

    package com.jieun.post_connect_thread_java;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MainActivity extends AppCompatActivity {
    
        private Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           // int i = 0;
    
            //Button connectBtn = findViewById(R.id.connectBtn);
            handler = new Handler(Looper.getMainLooper());
    
            TextView textView2 = findViewById(R.id.responseView);
    
            btn_Click(textView2);
        }
    
        public void btn_Click(View view) {
    
            TextView textView = (TextView) findViewById(R.id.textView);
            EditText editText = (EditText) findViewById(R.id.dataText);
            
    
            TextView textView2 = (TextView) findViewById(R.id.responseView);
    
            textView.setText(editText.getText());
    
    	String inputText = editText.getText().toString();
            String url = "서버 주소:포트번호";
            //ex) http://11.111.111:1000
    
            String data = "{ \"content\" : \""+inputText+"\" }";; //json 형식 데이터
    
            new Thread(() -> {
                String result = httpPostBodyConnection(url, data);
                // 처리 결과를 UI에 업데이트
                handler.post(() -> updateUI(result));
            }).start();
        }
    //
    //        //메소드 호출 실시
    //        httpPostBodyConnection(url, data);
    
    
    
        private String httpPostBodyConnection(String UrlData, String ParamData) {
            // 이전과 동일한 네트워크 연결 코드를 그대로 사용합니다.
            // 백그라운드 스레드에서 실행되기 때문에 메인 스레드에서는 문제가 없습니다.
            // ...
            String totalUrl = "";
            totalUrl = UrlData.trim().toString();
    
            //http 통신을 하기위한 객체 선언 실시
            URL url = null;
            HttpURLConnection conn = null;
    
            //http 통신 요청 후 응답 받은 데이터를 담기 위한 변수
            String responseData = "";
            BufferedReader br = null;
            StringBuffer sb = null;
    
            //메소드 호출 결과값을 반환하기 위한 변수
            String returnData = "";
    
    
            try {
                //파라미터로 들어온 url을 사용해 connection 실시
                url = null;
                url = new URL(totalUrl);
                conn = null;
                conn = (HttpURLConnection) url.openConnection();
    
                //http 요청에 필요한 타입 정의 실시
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/json; utf-8"); //post body json으로 던지기 위함
                conn.setRequestProperty("Accept", "application/json");
                conn.setDoOutput(true); //OutputStream을 사용해서 post body 데이터 전송
                try (OutputStream os = conn.getOutputStream()) {
                    byte request_data[] = ParamData.getBytes("utf-8");
                    Log.d("TAGGG",request_data.toString());
                    os.write(request_data);
                    //os.close();
                } catch (Exception e) {
                    Log.d("TAG3","여기다");
                    e.printStackTrace();
                }
    
                //http 요청 실시
                conn.connect();
                System.out.println("http 요청 방식 : " + "POST BODY JSON");
                System.out.println("http 요청 타입 : " + "application/json");
                System.out.println("http 요청 주소 : " + UrlData);
                System.out.println("http 요청 데이터 : " + ParamData);
                System.out.println("");
    
                //http 요청 후 응답 받은 데이터를 버퍼에 쌓는다
                br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                sb = new StringBuffer();
                while ((responseData = br.readLine()) != null) {
                    sb.append(responseData); //StringBuffer에 응답받은 데이터 순차적으로 저장 실시
                }
    
                //메소드 호출 완료 시 반환하는 변수에 버퍼 데이터 삽입 실시
                returnData = sb.toString();
                Log.d("TAG2", returnData);
                //http 요청 응답 코드 확인 실시
                String responseCode = String.valueOf(conn.getResponseCode());
                System.out.println("http 응답 코드 : " + responseCode);
                System.out.println("http 응답 데이터 : " + returnData);
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //http 요청 및 응답 완료 후 BufferedReader를 닫아줍니다
                try {
                    if (br != null) {
                        br.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            return returnData; // 네트워크 요청 결과를 반환
        }
    
        private void updateUI(String result) {
            // 네트워크 작업 완료 후 UI를 업데이트하는 메서드
            TextView textView2 = findViewById(R.id.responseView);
            //만약 서버한테 받는 값이 json형식이라면 파싱을 해야 함 아니면 \uc5ec\uc218 이런 식으로 보임
            textView2.setText(result);
            
        }
    }

     

     

    Manifest

     

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

     

     

     

Designed by Tistory.