OkHttp چیست و چگونه لاگ کردن در OkHttp را فعال کنیم؟ احتمالا برای هر توسعه دهنده اندروید این مشکل پیش آمده که درخواستی که به سرور ارسال می کنند دچار مشکل شده و خطایی دارد.و طبیعتا اقدام بعد این است که api رو داخل کلاینت دیگری مثلا مرورگر اجرا کنید تا خطا را واضح تر متوجه شوید.
اما چه می شود اگر درون خود پروژه اندروید بتوانیم لاگ درخواست به سرورمون رو به طور واضح ببینیم و متوجه مشکل خود بشویم و نیاز به کلاینت دیگر جهت اشکال زدایی نداشته باشیم! این کار با OkHttp logging interceptor ممکن است.
درواقع OkHttp یک رهگیر (interceptor) است که به شما جهت لاگ کردن درخواست API کمک میکند.پس اینجا رهگیر (interceptor) بیشتر شبیه به یک مدیر برای فراخوانی API است که به شما برای لاگ کردن درخواست و یا اعمال اکشن خاصی برروی درخواست کمک میکند.
برای شروع کار با OkHttp طبیعتا اول باید کتابخانه آن را درون پروژه ایمپورت کرد، پس در gradle برنامه وابستگی کتابخانه را اضافه میکنیم:
implementation "com.squareup.okhttp3:logging-interceptor:4.0.1"
و سپس برای لاگ کردن درخواست باید ابتدا یک درخواست ایجاد کنیم (با Retrofit درخواست را پیاده میکنیم )
همچنین بخوانید: آموزش Retrofit همراه با مثال
val client = OkHttpClient.Builder()
var request = Request.Builder()
.url()
.build()
ما یک آبجکت برای درخواست ایجاد کردیم همچنین یک نمونه از کلاس OkHttpClient بصورت ساده بدون هیچ پیکربندی یا config خاصی.
در ادامه باید درخواست را فراخوانی کنیم بصورت زیر:
client.newCall(request).enqueue(object :Callback{
override fun onFailure(request: Request?, e: IOException?) {
//API Call fails
}
override fun onResponse(response: Response?) {
//Do something with response
}
})
حالا درخواست فراخوانی می شود اما ما هیچ لاگی از این درخواست ( request ) دریافت نخواهیم کرد چرا که نمونه ای که از OkHttp ساختیم هیچ رهگیر یا interceptor خاصی ندارد و تنها یک نمونه ساده ست.
پس برای لاگ کردن درخواست ها باید به شی OkHttpClient که ساختیم یک رهگیر (interceptor) اضافه کنیم.و همانطور که گفته شد رهیگیر ها برای مانیتور کردن یا پیگیرری کردن فراخوان های API بصورت لاگ هایی در logcat بکار میرود.
ساختن رهگیر (interceptor) بدین صورت است:
val logging = HttpLoggingInterceptor()
logging.level = (HttpLoggingInterceptor.Level.BASIC)
در تکه کد فوق ما یک نمونه از کلاس HttpLoggingInterceptor ساختیم وسطح یا لول Basic برای لاگ هایی که قرار است نمایش دهد ست کردیم.سطح لاگ basic سطح اولیه لاگ های Okhttp ست که تنها درخواست و پاسخ را لاگ می کند.ما همچنین سطح های NONE ، HEADERS و BODY را هم داریم که هرکدام مقادیر زیر را لاگ میکنند:
و همچنین برای اضافه کردن این logger به درخواست ها کافی ست شی ساخته شده HttpLoggingInterceptor را به شی ساخته شده OkHttpClient بصورت زیر بسط دهید:
val client = OkHttpClient.Builder()
client.addInterceptor(logging)
و حالا درصورتی که برنامه مجدد اجرا کنیم ، لاگ های زیر را در Logcat خواهیم دید:
(POST /greeting http/1.1 (3-byte body –>
OK (22ms, 6-byte body) <– 200
نکته 1:
برای اضافه کردن یک TAG دلخواه به لاگ هایی که قرار است تنظیم شود شما کافیست بصورت زیر شی HttpLoggingInterceptor را تغییر دهید.
val logging = HttpLoggingInterceptor(object : Logger() {
fun log(message: String) {
Log.d("YOUR TAG", message)
}
})
و حالا پس از اجرای برنامه شما شاهد لاگ های خود با تگ مشخص شده هستید.
نکته ۲:
شما همچنین می توانید برای ایجاد رهگیر (interceptor) های شخصی سازی شده توسط خودتان کلاس Interceptro را ارث بری کنید و بدنه جدیدی را مطابق دستور زیر بسازید.
class CustomInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
request = request.newBuilder()
.build()
return chain.proceed(request)
}
}
و در ادامه آن را به شی client بصورت زیر ارجاع دهید
val client = OkHttpClient.Builder()
client.addInterceptor(CustomInterceptor())
نکته ۳:
برای مخفی کردن برخی اطلاعات خاص در logcat اندروید کافی ست بصورت زیر عمل کنید.
logging.redactHeader("Authorization")
logging.redactHeader("Cookie")
امیدوارم این آموزش به برخی سوالات شما ازجمله اینکه OkHttp چیست ؟ چگونه لاگ کردن در OkHttp فعال کنیم؟ و … جواب داده باشد.
1 Comment
سلام خیلی ممنون از آموزشتون
خیلی بهم کمک کرد