-
[안드로이드스튜디오/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"/>
'안드로이드 어플 개발' 카테고리의 다른 글
안드로이드 이미지 버튼 만들기 및 이벤트 처리 kotlin vs java (0) 2023.09.28 0. 강의 선택 및 안드로이드 스튜디오 설치(윈도우 계정 추가하기) (0) 2023.09.13