рдХреИрд╕реЗ рдореИрдВрдиреЗ рдХреЛрдЯрд▓рд┐рди рдХреЗ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдУрдЦрдЯрдк рдмреНрд░реЗрдХрд░ рдмрдирд╛рдпрд╛

рдЖрдЗрдП рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрдпрд╛рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

  1. рд╣реИрдбрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЯреЛрдХрди рдФрд░ рдпреВрдЬрд░ рдЖрдИрдбреА рднреЗрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
  2. рд╣реЗрдбрд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░ рдХреЛ рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд╕реЗ рдЦреАрдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
  3. рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд╣реИред рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЙрд░рдЖрдЙрдЯреНрд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
рдХрд╛рд░реНрдп рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдУрдХреН рдЯреНрдЯрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдмреНрд░реЗрдХрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдзреЗ рдШрдВрдЯреЗ рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЦреБрд╢ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдХрд┐ рдХреНрдпрд╛ рдУрдХреН рдЯреНрдЯрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмрд┐рдирд╛ рдмреНрд░реЗрдХрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдЪрд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ @HeaderMap рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛), рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрдЧ рдореЗрдВ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣реЗрдбрд░ () рд╡рд┐рдзрд┐ рд╣реИред

рдпрд╣рд╛рдБ рдХреНрд╡реЗрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдерд╛:

@FormUrlEncoded @POST("someurl/") suspend fun request1(@Field("idLast") idLastFeed: Long, @Field("autoview") autoView: Boolean, @HeaderMap headers: Map<String, String?>): Answer1 @FormUrlEncoded @POST("someurl/") suspend fun request2(@Field("ransom") ransom: Long, @HeaderMap headers: Map<String, String?>): Answer2 

рд▓реЗрдХрд┐рди рдпрд╣ рдмрди рдЧрдпрд╛ рд╣реИ:

 @FormUrlEncoded @POST("someurl") suspend fun request1(@Field("idLast") idLastFeed: Long, @Field("autoview") autoView: Boolean, @HeaderMap headers: Map<String, String?>?): Response<Answer1> @FormUrlEncoded @POST("someurl") suspend fun request2(@Field("ransom") ransom: Long, @HeaderMap headers: Map<String, String?>?): Response<Answer2> 

рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд▓рд┐рдП рдХреНрд╡реЗрд░реА рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░реЗрд╕реНрдЯрдХреНрд▓рд╛рдпрдВрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЯреЛрдХрди рдФрд░ рдЖрдИрдбреА рдкреНрд░реЗрдЬреЗрдВрдЯрд░ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╢реЗрдпрд░реНрд╕ рд╕реЗ рдЕрд▓рдЧ рди рд╣реЛрдВред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 class RestClient(private val api: Api, private val prefs: SharedPreferences) { suspend fun request1(last: Long, autoView: Boolean): Answer1 { return api.request1(last, autoView, headers()) } suspend fun request2(id: Long): Answer2 { return api.request2(id, headers()) } private val TOKEN_KEY = "Token" private val ID_KEY = "ID" fun headers(): Map<String, String> { return mapOf( TOKEN_KEY to prefs.getString(Constants.Preferences.SP_TOKEN_KEY, ""), ID_KEY to prefs.getLong(Constants.Preferences.SP_ID, -1).toString() ) } } 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  1. рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рддреЗ рд╣реИрдВред
  2. рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдЬреЛрдбрд╝реЗрдВред
  3. рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУред
  4. рд╣реЗрдбрд░ рд╕реЗ рд╣рдореЗрдВ рдирдП рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВред
  5. рд╣рдо рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред @Field рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд░ рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рд╣рдо @FieldMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ - рдкрд░реНрдЪред рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрд╡рдпрдВ рдЕрдиреБрд░реЛрдз рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреЛрдЯрд▓рд┐рди рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рдерд╛)ред рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред

рдпрд╣ рдХреНрд╡реЗрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 @FormUrlEncoded @POST("someurl/") suspend fun feedListMap(@FieldMap map: HashMap<String, out Any>?, @HeaderMap headers: Map<String, String?>?): Response<Answer1> @FormUrlEncoded @POST("someurl/") suspend fun feedListMap(@FieldMap map: HashMap<String, out Any>?, @HeaderMap headers: Map<String, String?>?): Response<Answer2> 

рдФрд░ рдпрд╣рд╛рдБ рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рд╣реИ:

 class Request<T>( var fieldHashMap: java.util.HashMap<String, out Any> = hashMapOf(), var headersHashMap: Map<String, String?>? = mapOf(), var req: suspend (HashMap<String, out Any>?, Map<String, String?>?) -> Response<T>? = { _,_ -> null} ){ fun send(): Response<T>? { return runBlocking { try { req.invoke(fieldHashMap, headersHashMap) } catch (e: Exception) { throw Exception(e.message ?: " ") } catch (t: Throwable) { throw Exception(t.message ?: " ") } } } } 

рдЕрдм RestClient рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 class RestClient(private val api: Api, private val prefs: SharedPreferences) { private val TOKEN_KEY = "Token" private val ID_KEY = "ID" fun headers(): Map<String, String> { return mapOf( TOKEN_KEY to prefs.getString(Constants.Preferences.SP_TOKEN_KEY, ""), ID_KEY to prefs.getLong(Constants.Preferences.SP_ID, -1).toString() ) } fun <T> buildRequest(request: Request<T>.() -> Unit): T? { val req = Request<T>() request(req) val res = req.send() val newToken = res?.headers()?.get(TOKEN_KEY) val newID = res?.headers()?.get(ID_KEY)?.toLong() if (newToken.notNull() && newID.notNull()) { prefs.edit() .putString(TOKEN_KEY, newToken) .putLong(ID_KEY, newID) .apply() } return res?.body() } fun fiedsMapForRequest1(last: Long, autoView: Boolean) = hashMapOf("idLast" to last, "autoview" to autoView) fun fiedsMapForRequest2(ransom: Long, autoView: Boolean) = hashMapOf("ransom" to ransom) } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ:

 try { val answer1 = restClient.buildRequest<Answer1> { fieldHashMap = restClient.fiedsMapForRequest1(1, false) headersHashMap = restClient.headers() req = api::request1 } val answer2 = restClient.buildRequest<Answer2> { fieldHashMap = restClient.fiedsMapForRequest2(1234) headersHashMap = restClient.headers() req = api::request2 } // do something with answer } catch (e: Exception) { viewState.showError(e.message.toString()) } finally { viewState.hideProgress() } 

рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреЛрдЯрд▓рд┐рди рдХреА рдорджрдж рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдмреНрд░реЗрдХрд░ рдмрдирд╛рдпрд╛ред

PS рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╣реА рд░реЛрдорд╛рдВрдЪрдХ рдерд╛, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ Okhttp рдмреНрд░реЗрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

Source: https://habr.com/ru/post/hi465781/


All Articles