HttpHelper.kt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. (обратите внимение, позиционного параметра data нет,
  55. поэтому используем именованный параметр headers)
  56. Http.call(
  57. Http.buildRequest(
  58. "http://s4a.kolei.ru/Product",
  59. headers = mapOf("token" to token)
  60. )
  61. ) { response, error -> ... }
  62. */
  63. object Http {
  64. private val client = OkHttpClient()
  65. fun buildRequest(
  66. url: String,
  67. data: String? = null,
  68. headers: Map<String, String>? = null): Request
  69. {
  70. val request = Request.Builder().url(url)
  71. if (data != null) {
  72. val json = "application/json; charset=utf-8".toMediaTypeOrNull()
  73. request.post(data.toRequestBody(json))
  74. }
  75. if(headers!=null){
  76. for((key, value) in headers){
  77. request.addHeader(key, value)
  78. }
  79. }
  80. return request.build()
  81. }
  82. fun call(url: Any, callback: (response: Response?, error: Exception?)->Unit) {
  83. var request: Request = when (url) {
  84. is String -> Request.Builder()
  85. .url(url)
  86. .build()
  87. is Request -> url as Request
  88. else -> {
  89. callback.invoke(null, Exception("Не верный тип параметра \"url\""))
  90. return
  91. }
  92. }
  93. client.newCall(request).enqueue(object : Callback {
  94. override fun onFailure(call: Call, e: IOException) {
  95. callback.invoke(null, Exception(e.message!!))
  96. }
  97. override fun onResponse(call: Call, response: Response) {
  98. response.use {
  99. callback.invoke(response, null)
  100. }
  101. }
  102. })
  103. }
  104. }