我在我的应用程序中收到了请求,但我在 logcat 中看不到请求日志,但我已经有了 okhttp 和日志记录拦截器依赖项。
您可以在邮递员或您自己的浏览器上检查它是否工作正常。
我也想知道如何在get请求中集成apikey(它是必需的),但实现在下面。
data class NewsList(
@SerializedName("articles")
val data:List<News>
)
data class News(
val title:String,
@SerializedName("image")
val image:String,
@SerializedName("publishedAt")
val time:LocalDateTime,
@SerializedName("source")
val author:Author
)
data class Author (
@SerializedName("name")
val name:String
)
interface NewsService {
@Headers("application/json","charset=utf-8")
@GET("top-headlines?category=general&lang=en&country=US&max=6")
suspend fun getNews() :
Response<NewsList>
}
@Provides
@Singleton
fun provideRetrofitService():NewsService{
val api_interceptor = Interceptor {
val originalRequest = it.request()
val newHttpUrl = originalRequest.url.newBuilder()
.addQueryParameter("apikey",
"8cd9955292e0849aa6d73b2c15cef758")
.build()
val newRequest = originalRequest.newBuilder()
.url(newHttpUrl)
.build()
it.proceed(newRequest)
}
val httpLoggingInterceptor = HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val OkHttpClient = OkHttpClient().newBuilder()
.addNetworkInterceptor(api_interceptor)
.addInterceptor(ErrorIntercept())
.addInterceptor(httpLoggingInterceptor)
.build()
return Retrofit.Builder()
.baseUrl("https://gnews.io/api/v4/")
.client(OkHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(NewsService::class.java)
}
class ErrorIntercept:Interceptor{
override fun intercept(chain: Interceptor.Chain): Response {
val req : Request = chain.request()
val resp = chain.proceed(req)
when(resp.code){
200->{
Log.e("200 code","Request success")
}
404,402,401->{
Log.e("404,402,401 code", "response was failed")
}
}
return resp
}
}
}
class NewsRepositoryImpl @Inject constructor(private val api:NewsService) : NewsRepository {
override suspend fun getNews(): Resource<Response<NewsList>> {
return try {
Resource.Companion.Success(
data = api.getNews()
)
}catch (e:Exception){
Resource.Companion.Error("Error")
}
}
}
data class DataEvent(
val data: Response<NewsList>? = null,
val error:String? = null,
val isLoading:Boolean = false
)
sealed class Resource<T>(val data: T? = null, val message: String? = null) {
companion object{
class Success<T>(data: T?): Resource<T>(data)
class Error<T>(message: String, data: T? = null): Resource<T>(data, message)
}
}
@HiltViewModel
class MainViewmodel@Inject constructor(private val repository:NewsRepository)
:ViewModel() {
var newsstatemain by mutableStateOf(DataEvent())
private set
fun loadnews(){
viewModelScope.launch {
newsstatemain = newsstatemain.copy(
isLoading = true,
error = null
)
when(val result = repository.getNews()){
is Resource.Companion.Success<*> ->{
newsstatemain.copy(
data = result.data,
isLoading = false,
error = null
)
}
is Resource.Companion.Error<*>->{
newsstatemain = newsstatemain.copy(
data = null,
isLoading = false,
error = result.message
)
}
}
}
}
}