android-retrofit

安装量: 91
排名: #8831

安装

npx skills add https://github.com/new-silvermoon/awesome-android-agent-skills --skill android-retrofit
Android Networking with Retrofit
Instructions
When implementing network layers using
Retrofit
, follow these modern Android best practices (2025).
1. URL Manipulation
Retrofit allows dynamic URL updates through replacement blocks and query parameters.
Dynamic Paths
Use
{name}
in the relative URL and
@Path("name")
in parameters.
Query Parameters
Use
@Query("key")
for individual parameters.
Complex Queries
Use
@QueryMap Map
for dynamic sets of parameters.
interface
SearchService
{
@GET
(
"group/{id}/users"
)
suspend
fun
groupList
(
@Path
(
"id"
)
groupId
:
Int
,
@Query
(
"sort"
)
sort
:
String
?
,
@QueryMap
options
:
Map
<
String
,
String
>
=
emptyMap
(
)
)
:
List
<
User
>
}
2. Request Body & Form Data
You can send objects as JSON bodies or use form-encoded/multipart formats.
@Body
Serializes an object using the configured converter (JSON).
@FormUrlEncoded
Sends data as
application/x-www-form-urlencoded
. Use
@Field
.
@Multipart
Sends data as
multipart/form-data
. Use
@Part
.
interface
UserService
{
@POST
(
"users/new"
)
suspend
fun
createUser
(
@Body
user
:
User
)
:
User
@FormUrlEncoded
@POST
(
"user/edit"
)
suspend
fun
updateUser
(
@Field
(
"first_name"
)
first
:
String
,
@Field
(
"last_name"
)
last
:
String
)
:
User
@Multipart
@PUT
(
"user/photo"
)
suspend
fun
uploadPhoto
(
@Part
(
"description"
)
description
:
RequestBody
,
@Part
photo
:
MultipartBody
.
Part
)
:
User
}
3. Header Manipulation
Headers can be set statically for a method or dynamically via parameters.
Static Headers
Use
@Headers
.
Dynamic Headers
Use
@Header
.
Header Maps
Use
@HeaderMap
.
Global Headers
Use an OkHttp
Interceptor
.
interface
WidgetService
{
@Headers
(
"Cache-Control: max-age=640000"
)
@GET
(
"widget/list"
)
suspend
fun
widgetList
(
)
:
List
<
Widget
>
@GET
(
"user"
)
suspend
fun
getUser
(
@Header
(
"Authorization"
)
token
:
String
)
:
User
}
4. Kotlin Support & Response Handling
When using
suspend
functions, you have two choices for return types:
Direct Body (
User
)
Returns the deserialized body. Throws
HttpException
for non-2xx responses.
Response
Provides access to the status code, headers, and error body. Does NOT throw on non-2xx results. @GET ( "users" ) suspend fun getUsers ( ) : List < User

// Throws on error @GET ( "users" ) suspend fun getUsersResponse ( ) : Response < List < User

// Manual check 5. Hilt & Serialization Configuration Provide your Retrofit instances as singletons in a Hilt module. @Module @InstallIn ( SingletonComponent :: class ) object NetworkModule { @Provides @Singleton fun provideJson ( ) : Json = Json { ignoreUnknownKeys = true coerceInputValues = true } @Provides @Singleton fun provideOkHttpClient ( ) : OkHttpClient = OkHttpClient . Builder ( ) . addInterceptor ( HttpLoggingInterceptor ( ) . apply { level = HttpLoggingInterceptor . Level . BODY } ) . connectTimeout ( 30 , TimeUnit . SECONDS ) . build ( ) @Provides @Singleton fun provideRetrofit ( okHttpClient : OkHttpClient , json : Json ) : Retrofit = Retrofit . Builder ( ) . baseUrl ( "https://api.github.com/" ) . client ( okHttpClient ) . addConverterFactory ( json . asConverterFactory ( "application/json" . toMediaType ( ) ) ) . build ( ) } 6. Error Handling in Repositories Always handle network exceptions in the Repository layer to keep the UI state clean. class GitHubRepository @Inject constructor ( private val service : GitHubService ) { suspend fun getRepos ( username : String ) : Result < List < Repo

= runCatching { // Direct body call throws HttpException on 4xx/5xx service . listRepos ( username ) } . onFailure { exception -> // Handle specific exceptions like UnknownHostException or SocketTimeoutException } } 7. Checklist Use suspend functions for all network calls. Prefer Response if you need to handle specific status codes (e.g., 401 Unauthorized). Use @Path and @Query instead of manual string concatenation for URLs. Configure OkHttpClient with logging (for debug) and sensible timeouts. Map API DTOs to Domain models to decouple layers.

返回排行榜