투케이2K

512. (kotlin/코틀린) [HttpURLConnection] http post body json 방식 요청 수행 실시 본문

Kotlin

512. (kotlin/코틀린) [HttpURLConnection] http post body json 방식 요청 수행 실시

투케이2K 2024. 7. 29. 21:30

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

        // ----------------------------------------------------------------------------------
        // TODO [SEARCH FAST] : [Async] : [POST] : [BODY JSON] : requestPostBodyJsonHttp
        // ----------------------------------------------------------------------------------
        // TODO [호출 방법 소스 코드]
        /*
        // [URL 주소 선언]
        val url = "https://jsonplaceholder.typicode.com/posts"

        // [헤더 생성]
        val header: MutableMap<String, Any> = HashMap()

        // [파라미터 생성]
        val params: MutableMap<String, Any> = HashMap()
        params["userId"] = 1
        params["id"] = 1

        // [http 요청 수행]
        N_NormalHttp.requestPostBodyJsonHttp(A_Webview@this, "http 요청", url, header, params) // [http 요청]
            .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
            .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
            .subscribe(
                { value ->
                    S_Log._W_(ACTIVITY_NAME + " : HTTP 통신 결과 확인", arrayOf(value.toString()))
                },
                { error ->
                    S_Log._E_(ACTIVITY_NAME + " : HTTP 통신 에러 확인", arrayOf(error.message.toString()))
                }
            )
            {
            }
        */
        // ----------------------------------------------------------------------------------
        fun requestPostBodyJsonHttp(mContext : Context, tag : String, url: String, header: Map<String, Any>, params: Map<String, Any>): Observable<String> {

            // [로직 처리 실시]
            return Observable.create { subscriber: ObservableEmitter<String> ->

                object : Thread() {

                    override fun run() {

                        // [변수 선언]
                        var httpConn: HttpURLConnection? = null
                        var bufferedReader: BufferedReader? = null
                        var pw: PrintWriter? = null

                        try {

                            // ------------------------------------------------------
                            // TODO [URL 변수 선언 실시]
                            // ------------------------------------------------------
                            var urlData = url.trim { it <= ' ' }
                            if (urlData.startsWith("http") == false) {
                                subscriber.onError(Throwable("[ERROR] : : [requestPostBodyJsonHttp] : Url Http Not Start"))
                                return
                            }
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [HTTP 전송 타입 설정]
                            // ------------------------------------------------------
                            val reqUrl = URL(urlData)
                            httpConn = reqUrl.openConnection() as HttpURLConnection
                            httpConn.requestMethod = "POST"
                            httpConn!!.addRequestProperty("Content-Type", "application/json") // TODO [헤더]
                            httpConn.addRequestProperty("Cache-Control", "no-cache") // TODO [헤더]

                            // [로그 출력 헤더 삽입]
                            val requestHeader: MutableMap<String, String> = HashMap()
                            requestHeader["Content-Type"] = "application/json"
                            requestHeader["Cache-Control"] = "no-cache"

                            if (C_Util.mapNotNull(header) === true) {
                                val set: Set<*> = header.keys
                                val iterator = set.iterator()
                                while (iterator.hasNext()) {
                                    val key = iterator.next() as String
                                    requestHeader[key] = header[key].toString() // [로그 출력 헤더]
                                    httpConn.addRequestProperty(key, header[key].toString()) // TODO [헤더]
                                }
                            }

                            httpConn.doOutput = true // [OutputStream 으로 POST 데이터를 넘겨주겠다는 옵션]
                            httpConn.doInput = true // [InputStream 으로 서버로 부터 응답을 받겠다는 옵션]
                            httpConn.connectTimeout = TIME_OUT_SECOND * 1000 // [연결 타임 아웃 시간] : [30 * 1000]
                            httpConn.readTimeout = TIME_OUT_SECOND * 1000 // [Read 시간] : [30 * 1000]
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [Body 에 파라미터 추가 실시]

                            // ------------------------------------------------------
                            var bodyData: String? = ""
                            if (C_Util.mapNotNull(params) === true) { // [파라미터가 있는 경우]
                                bodyData = java.lang.String.valueOf(C_Util.mapToJsonObject(params))
                                pw = PrintWriter(OutputStreamWriter(httpConn.outputStream, "UTF-8"))
                                pw.write(bodyData)
                                pw.flush()
                            }
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [요청 로그 출력 실시]
                            // ------------------------------------------------------
                            S_Log._F_(mContext, "requestPostBodyJsonHttp :: HTTP 비동기 POST [요청] 실시", arrayOf(
                                "TAG :: $tag",
                                "TYPE :: " + "POST >> REQUEST",
                                "URL :: $urlData",
                                "HEADER :: $requestHeader",
                                "BODY :: $bodyData"
                            ))
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [HTTP 응답 상태 확인]
                            // ------------------------------------------------------
                            var line: String? = ""
                            var responseData = ""
                            val responseCode = httpConn.responseCode

                            bufferedReader = if (responseCode >= 200 && responseCode < 400) {
                                BufferedReader(InputStreamReader(httpConn.inputStream, "UTF-8"))
                            } else {
                                BufferedReader(InputStreamReader(httpConn.errorStream, "UTF-8"))
                            }

                            val stringBuffer = StringBuffer()
                            while (bufferedReader.readLine().also { line = it } != null) { // [응답 Body 데이터 읽기]
                                stringBuffer.append(line)
                            }

                            // [응답 헤더의 정보를 모두 출력]
                            //val responseHeader: MutableMap<String, String> = HashMap()
                            val responseHeader = httpConn.headerFields

                            // [Response 응답 값 삽입]
                            responseData = stringBuffer.toString()
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [응답 로그 출력 실시]
                            // ------------------------------------------------------
                            S_Log._F_(mContext, "requestPostBodyJsonHttp :: HTTP 비동기 POST [응답] 확인", arrayOf(
                                "TAG :: $tag",
                                "TYPE :: " + "POST >> RESPONSE",
                                "URL :: $urlData",
                                "CODE :: $responseCode",
                                "HEADER :: $responseHeader",
                                "DATA :: $responseData"
                            ))
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [응답 값에 따라서 로직 분기 처리]
                            // ------------------------------------------------------
                            if (responseCode >= 200 && responseCode < 400) {

                                // TODO [결과 전송 실시]
                                subscriber.onNext(responseData)
                                subscriber.onComplete()

                            } else {

                                subscriber.onError(Throwable("[ERROR] : : [requestPostBodyJsonHttp] : " + C_ErrorCheck.getErrorHttpMsg(responseCode.toString())))

                            }
                            // ------------------------------------------------------

                        } catch (e: Exception) {
                            e.printStackTrace()

                            // ------------------------------------------------------
                            // [로그 출력]
                            // ------------------------------------------------------
                            S_Log._printStackTrace_(mContext, S_FinalData.LOG_BUG_STATE, arrayOf(
                                "requestPostBodyJsonHttp :: HTTP 비동기 POST [EXCEPTION] 확인",
                                "TAG :: $tag",
                                "TYPE :: " + "POST >> EXCEPTION",
                                "EXCEPTION :: " + e.message.toString()
                            ), e)
                            // ------------------------------------------------------


                            // ------------------------------------------------------
                            // TODO [리턴 데이터 반환]
                            // ------------------------------------------------------
                            try {
                                subscriber.onError(Throwable("[EXCEPTION] : [requestPostBodyJsonHttp] : " + e.message.toString()))
                            } catch (ex: Exception) {
                                ex.printStackTrace()
                            }
                            // ------------------------------------------------------

                        } finally {

                            // TODO [마지막 종료 처리]
                            try {
                                if (httpConn != null){
                                    httpConn?.disconnect()
                                }

                                if (bufferedReader != null){
                                    bufferedReader?.close()
                                }

                            } catch (es: Exception) {
                                es.printStackTrace()
                            }
                        }
                    }
                }.start()

            }
        }
 

[결과 출력]

 

반응형
Comments