HttpHelper.kt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // тут не забыть установить свой пакет
  2. package ru.yotc.baza
  3. import okhttp3.*
  4. import okhttp3.MediaType.Companion.toMediaTypeOrNull
  5. import okhttp3.RequestBody.Companion.toRequestBody
  6. import okio.IOException
  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. Использование для POST-запросов, или для запросов с заголовками
  42. val json = JSONObject()
  43. json.put("username", userName)
  44. json.put("password", password)
  45. Http.call(
  46. Http.buildRequest(
  47. "http://s4a.kolei.ru/login",
  48. json.toString()
  49. )
  50. ) { response, error -> ... }
  51. */
  52. /*
  53. Использование для запросов с заголовками
  54. Http.call(
  55. Http.buildRequest(
  56. "http://s4a.kolei.ru/Product",
  57. headers = mapOf("token" to token)
  58. )
  59. ) { response, error -> ... }
  60. */
  61. object Http {
  62. private val client = OkHttpClient()
  63. fun buildRequest(url: String, data: String? = null, method: String = "GET", headers: Map<String, String>? = null): Request {
  64. val json = "application/json; charset=utf-8".toMediaTypeOrNull()
  65. val request = Request.Builder().url(url)
  66. if (data != null)
  67. request.post(data.toRequestBody(json))
  68. else
  69. request.get()
  70. if(headers!=null){
  71. for((key, value) in headers){
  72. request.addHeader(key, value)
  73. }
  74. }
  75. return request.build()
  76. }
  77. fun call(url: Any, callback: (response: Response?, error: Exception?)->Unit) {
  78. var request: Request = when (url) {
  79. is String -> Request.Builder()
  80. .url(url)
  81. .build()
  82. is Request -> url as Request
  83. else -> {
  84. callback.invoke(null, Exception("Не верный тип параметра \"url\""))
  85. return
  86. }
  87. }
  88. client.newCall(request).enqueue(object : Callback {
  89. override fun onFailure(call: Call, e: IOException) {
  90. callback.invoke(null, Exception(e.message!!))
  91. }
  92. override fun onResponse(call: Call, response: Response) {
  93. response.use {
  94. callback.invoke(response, null)
  95. }
  96. }
  97. })
  98. }
  99. }