HttpHelper.kt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package ru.yotc.myapplication
  2. import android.graphics.Bitmap
  3. import android.graphics.BitmapFactory
  4. import org.json.JSONObject
  5. import java.io.*
  6. import java.net.HttpURLConnection
  7. import java.net.URL
  8. import java.net.URLEncoder
  9. import javax.net.ssl.HttpsURLConnection
  10. /*
  11. Перед использованием не забудьте добавить в манифест
  12. разрешение
  13. <uses-permission android:name="android.permission.INTERNET" />
  14. И атрибут в тег application
  15. android:usesCleartextTraffic="true"
  16. */
  17. object HTTP
  18. {
  19. private const val GET : String = "GET"
  20. private const val POST : String = "POST"
  21. /**
  22. * Метод для отправки POST-запросов
  23. *
  24. * Запросы отправляются в отдельном потоке
  25. * Автоматически поддерживает http/httpS
  26. * Можно задать заголовки запроса
  27. * По-умолчанию отправляет данные в формате application/x-www-form-urlencoded
  28. * при задании заголовка Content-type: application/json автоматически переключается на это тип
  29. *
  30. * @param url Полный URL сайта (протокол + домен + путь)
  31. * @param postData Даные для отправки
  32. * @param headers Ассоциативный массив заголовков запроса
  33. * @param callback Лямбда-функция обратного вызова
  34. */
  35. fun requestPOST(
  36. url: String,
  37. postData: JSONObject? = null,
  38. headers: Map<String, String>?,
  39. callback: (result: String?, error: String)->Unit
  40. ) {
  41. Thread( Runnable {
  42. var error = ""
  43. var result: String? = null
  44. try {
  45. val urlURL = URL(url)
  46. val conn: HttpURLConnection = if (url.startsWith("https:", true))
  47. urlURL.openConnection() as HttpsURLConnection
  48. else
  49. urlURL.openConnection() as HttpURLConnection
  50. // если задан тип контента application/json, то на выход пишу как есть
  51. var contentTypeJson = false
  52. if(headers!=null){
  53. for((key, value) in headers){
  54. if(key.lowercase()=="content-type" && value.startsWith("application/json"))
  55. contentTypeJson = true
  56. conn.setRequestProperty(key, value)
  57. }
  58. }
  59. conn.readTimeout = 10000
  60. conn.connectTimeout = 10000
  61. conn.requestMethod = POST
  62. conn.doInput = true
  63. conn.doOutput = true
  64. val os: OutputStream = conn.outputStream
  65. if (postData != null) {
  66. val writer = BufferedWriter(OutputStreamWriter(os, "UTF-8"))
  67. var content = ""
  68. content = if(contentTypeJson)
  69. postData.toString()
  70. else
  71. encodeParams(postData)?:""
  72. writer.write(content)
  73. writer.flush()
  74. writer.close()
  75. }
  76. os.close()
  77. val responseCode: Int = conn.responseCode // To Check for 200
  78. if (responseCode == HttpsURLConnection.HTTP_OK) {
  79. val `in` = BufferedReader(InputStreamReader(conn.inputStream))
  80. val sb = StringBuffer("")
  81. var line: String? = ""
  82. while (`in`.readLine().also { line = it } != null) {
  83. sb.append(line)
  84. break
  85. }
  86. `in`.close()
  87. result = sb.toString()
  88. }
  89. else {
  90. error = "Response code ${responseCode}"
  91. }
  92. }
  93. catch (e: Exception) {
  94. error = e.message.toString()
  95. }
  96. callback.invoke(result, error)
  97. }).start()
  98. }
  99. fun getImage(url: String, callback: (result: Bitmap?, error: String)->Unit){
  100. Thread( Runnable {
  101. var image: Bitmap? = null
  102. var error = ""
  103. try {
  104. val `in` = URL(url).openStream()
  105. image = BitmapFactory.decodeStream(`in`)
  106. }
  107. catch (e: Exception) {
  108. error = e.message.toString()
  109. }
  110. callback.invoke(image, error)
  111. }).start()
  112. }
  113. fun requestGET(
  114. r_url: String,
  115. headers: Map<String, String>?,
  116. callback: (result: String?, error: String)->Unit
  117. ) {
  118. Thread( Runnable {
  119. var error = ""
  120. var result: String? = null
  121. try {
  122. val obj = URL(r_url)
  123. val con: HttpURLConnection = if(r_url.startsWith("https:", true))
  124. obj.openConnection() as HttpsURLConnection
  125. else
  126. obj.openConnection() as HttpURLConnection
  127. if(headers!=null){
  128. for((key, value) in headers){
  129. con.setRequestProperty(key, value)
  130. }
  131. }
  132. con.requestMethod = GET
  133. val responseCode = con.responseCode
  134. result = if (responseCode == HttpURLConnection.HTTP_OK) { // connection ok
  135. val `in` =
  136. BufferedReader(InputStreamReader(con.inputStream))
  137. var inputLine: String?
  138. val response = StringBuffer()
  139. while (`in`.readLine().also { inputLine = it } != null) {
  140. response.append(inputLine)
  141. }
  142. `in`.close()
  143. response.toString()
  144. } else {
  145. null
  146. }
  147. }
  148. catch (e: Exception){
  149. error = e.message.toString()
  150. }
  151. callback.invoke(result, error)
  152. }).start()
  153. }
  154. @Throws(IOException::class)
  155. private fun encodeParams(params: JSONObject): String? {
  156. val result = StringBuilder()
  157. var first = true
  158. val itr = params.keys()
  159. while (itr.hasNext()) {
  160. val key = itr.next()
  161. val value = params[key]
  162. if (first) first = false else result.append("&")
  163. result.append(URLEncoder.encode(key, "UTF-8"))
  164. result.append("=")
  165. result.append(URLEncoder.encode(value.toString(), "UTF-8"))
  166. }
  167. return result.toString()
  168. }
  169. }