Notice
Recent Posts
Recent Comments
Link
투케이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()
}
}
[결과 출력]
반응형
'Kotlin' 카테고리의 다른 글
Comments