前言
网络是任何 Android 应用程序的主要组件之一。有很多很好的库可以帮助我们轻松地建立网络。此类库的一些示例包括 Retrofit 和FastAndroidNetworking。
在本文中,我将为您提供使用 Retrofit 与 RxJava 和 Kotlin 构建 Android 应用程序所需的基本设置和概念
改造简介
Retrofit 是一个 REST 客户端,它使用 OkHttp 作为 HttpClient 和 Json 解析器来解析响应。OkHttp 已成为几乎所有 Android 应用程序中事实上的 Http 客户端。Retrofit 基本上为 OkHttp 提供了更好的包装器。
设置改造的简单步骤:
object Networking {
private const val NETWORK_CALL_TIMEOUT = 60
fun create(baseUrl: String, cacheDir: File, cacheSize: Long): NetworkService {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(
OkHttpClient.Builder()
.cache(Cache(cacheDir, cacheSize))
.addInterceptor(HttpLoggingInterceptor()
.apply {
level = if (BuildConfig.DEBUG)
HttpLoggingInterceptor.Level.BODY
else
HttpLoggingInterceptor.Level.NONE
})
.readTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS)
.writeTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS)
.build()
)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(NetworkService::class.java)
}
}
您可以像这样创建一个 NetworkService 的实例:
Networking.create(
"https://example.mindorks.com/",
application.cacheDir,
10 * 1024 * 1024 // 10MB
)
你知道什么是 NetworkService 吗?
你一定没有,因为我还没有解释过。再等一段时间。在此之前,让我们尝试了解配置中提供的各种实例来创建 NetworkService(直到这里是一个幽灵)。
-
BaseUrl:这是定义所有 API 通用的 URL 部分的字符串。
-
OkHttpClient将网络的所有功能添加到 Retrofit 中。如果要显式自定义它们,则需要在其构建器中定义一些东西,否则大多数这些东西将回退到默认值。
-
缓存:使用它来启用和设置 OkHttp 的离线缓存能力。
-
HttpLoggingInterceptor:这是一个拦截器,它将在 logcat 中记录 API 的请求和响应以进行调试构建。
-
Timeouts:它提供了从服务器读取和在客户端写入的 Http 连接时间限制。
-
GsonConvertorFactory:您需要指定应使用哪个库 Retrofit 进行序列化和反序列化。这里使用了 Gson,它是一个流行的库,有助于对象到 JSON 和 JSON 到对象的转换。
-
RxJava2CallAdapterFactory:Retrofit 默认提供Call对象来获取 HTTP 响应。但是在我们的例子中,我们需要在Observable或Single中观察我们的响应,就像我们的代码示例中一样。因此,为了实现这一点,我们需要告诉 Retrofit 使用 RxJava 而不是其默认的调用包装器。
-
NetworkService:使用上述配置构建 Retrofit 实例后,需要传递定义 Retrofit 需要处理的 API 签名的接口。我们现在将探索NetworkService。
interface NetworkService {
/*---------------------HTTP METHODS-----------------------------*/
// makes http get request with header
@GET("dummy/list") // endpoint will be appended to the base url
fun doDummyGetRequestCall(
@Header("some-header-key") someHeader: String
): Single<DummyResponse>
// makes http post request with body and header
@POST("dummy/list")
fun doDummyPostRequestCall(
@Body request: DummyRequest,
@Header("some-header-key") someHeader: String,
@Header("some-more-header-key") someMoreHeader: String
): Single<DummyResponse>
// makes http put request with body and header
@PUT("dummy/list")
fun doDummyPutRequestCall(
@Body request: DummyRequest,
@Header("some-header-key") someHeader: String
): Single<DummyResponse>
// makes http delete request with body and header
@DELETE("dummy/list")
fun doDummyDeleteRequestCall(
@Header("some-header-key") someHeader: String,
@Header("some-more-header-key") someMoreHeader: String
): Single<DummyResponse>
/*----------------------ADDITIONAL THINGS---------------------------*/
// makes http get request with dynamic endpoint and header
@GET("dummy/{userId}/list")
fun doDummyGetRequestVariablePathCall(
@Path("userId") userId: String,
@Header("some-header-key") someHeader: String
): Single<DummyResponse>
// makes http get request with query parameter and header
// base url + dummy/list/search?query=<some query value>
@GET("dummy/list/search")
fun doDummyGetRequestQueryParamsCall(
@Query("query") query: String,
@Header("some-header-key") someHeader: String
): Single<DummyResponse>
}
下面提供了请求和响应类:
data class DummyRequest(
@Expose
@SerializedName("id")
var id: String
)
data class DummyResponse(
@Expose
@SerializedName("message")
var message: String,
@Expose
@SerializedName("data")
val data: List<Dummy>
)
data class Dummy(
@Expose
@SerializedName("name")
val name: String,
@Expose
@SerializedName("imageUrl")
val imageUrl: String?
)
- Multipart:您可以使用 multipart 在单个请求中上传多个文件和图像。
@Singleton
interface NetworkService {
...
@Multipart
@POST("user/profile-pic")
fun doImageUploadCall(
@Part image: MultipartBody.Part,
@Header("some-header-key") someHeader: String
): Single<ImageUploadResponse>
}
data class ImageUploadResponse(
@Expose
@SerializedName("message")
val message: String,
@Expose
@SerializedName("imageUrl")
val imageUrl: String
)
fun makeImageUpload(image: File): Single<String> {
val filePart = MultipartBody.Part.createFormData(
"image",
image.name,
RequestBody.create(MediaType.parse("image/*"), image))
return networkService.doImageUploadCall(filePart).map { /*Do Somthing*/ }
}
本文到此结束。我希望您一定已经掌握了在 Android 应用程序中处理网络的概念。
作者:Janishar Ali
链接:https://blog.mindorks.com/getting-started-with-retrofit-using-kotlin-and-rxjava-android-networking-library
网友评论