Http.kt 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // package тут не забыть установить свой пакет
  2. import okhttp3.*
  3. import okhttp3.MediaType.Companion.toMediaTypeOrNull
  4. import okhttp3.RequestBody.Companion.toRequestBody
  5. import okio.IOException
  6. typealias HttpCallback = (response: Response?, error: Exception?)->Unit
  7. /*
  8. В манифест добавьте разрешение на работу с интернетом
  9. <uses-permission android:name="android.permission.INTERNET" />
  10. И, если на сайте нет сертификата, атрибут в тег **application**:
  11. android:usesCleartextTraffic="true"
  12. В зависимости проекта добавить билиотеку:
  13. implementation 'com.squareup.okhttp3:okhttp:4.10.0'
  14. */
  15. /*
  16. Использование для GET-запросов:
  17. Http.call("урл строка"){ response, error ->
  18. try {
  19. // если в запросе получено исключение, то "выбрасываем" его
  20. if (error != null) throw error
  21. // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
  22. if (!response!!.isSuccessful) throw Exception(response.message)
  23. // тут обработка результата:
  24. // тело ответа как строка: response.body!!.string()
  25. // тело ответа как изображение: BitmapFactory.decodeStream(response.body!!.byteStream())
  26. } catch (e: Exception) {
  27. // любую ошибку показываем на экране
  28. runOnUiThread {
  29. AlertDialog.Builder(this)
  30. .setTitle("Ошибка")
  31. .setMessage(e.message)
  32. .setPositiveButton("OK", null)
  33. .create()
  34. .show()
  35. }
  36. }
  37. }
  38. }
  39. */
  40. /*
  41. callback отдельным свойством
  42. Http.call(
  43. "http://s4a.kolei.ru/Product",
  44. weatherCallback
  45. )
  46. private val weatherCallback: HttpCallback = {
  47. response, error ->
  48. try {
  49. if (error != null) throw error
  50. if (!response!!.isSuccessful) throw Exception(response.message)
  51. // тут реализуем обработку результата
  52. } catch (e: Exception) {
  53. // любую ошибку показываем на экране
  54. showAlert(e.message ?: "какая-то ошибка")
  55. }
  56. }
  57. */
  58. /*
  59. Использование для POST-запросов
  60. val json = JSONObject()
  61. json.put("username", userName)
  62. json.put("password", password)
  63. Http.call(
  64. Http.buildRequest(
  65. "http://s4a.kolei.ru/login",
  66. json.toString()
  67. )
  68. ) { response, error -> ... }
  69. */
  70. /*
  71. Использование для запросов с заголовками
  72. (обратите внимение, позиционного параметра data нет,
  73. поэтому используем именованный параметр headers)
  74. Http.call(
  75. Http.buildRequest(
  76. "http://s4a.kolei.ru/Product",
  77. headers = mapOf("token" to token)
  78. )
  79. ) { response, error -> ... }
  80. */
  81. object Http {
  82. private val client = OkHttpClient()
  83. fun buildRequest(
  84. url: String,
  85. data: String? = null,
  86. headers: Map<String, String>? = null): Request
  87. {
  88. val request = Request.Builder().url(url)
  89. if (data != null) {
  90. val json = "application/json; charset=utf-8".toMediaTypeOrNull()
  91. request.post(data.toRequestBody(json))
  92. }
  93. if(headers!=null){
  94. for((key, value) in headers){
  95. request.addHeader(key, value)
  96. }
  97. }
  98. return request.build()
  99. }
  100. fun call(url: Any, callback: (response: Response?, error: Exception?)->Unit) {
  101. var request: Request = when (url) {
  102. is String -> Request.Builder()
  103. .url(url)
  104. .build()
  105. is Request -> url as Request
  106. else -> {
  107. callback.invoke(null, Exception("Не верный тип параметра \"url\""))
  108. return
  109. }
  110. }
  111. client.newCall(request).enqueue(object : Callback {
  112. override fun onFailure(call: Call, e: IOException) {
  113. callback.invoke(null, Exception(e.message!!))
  114. }
  115. override fun onResponse(call: Call, response: Response) {
  116. response.use {
  117. callback.invoke(response, null)
  118. }
  119. }
  120. })
  121. }
  122. }