-
Notifications
You must be signed in to change notification settings - Fork 0
OkHttp
یکی دیگر از کتابخانههای که با استفاده از آن میتوان در اندروید یک درخواست HTTP را انجام داد، کتابخانه OkHttp است. در این بخش پروژه، مانند دو بخش قبل (Retrofit و Volley) میخواهیم پس از لمس طولانی کاربر و نمایش نشانگر، آدرس نقطه انتخاب شده را با استفاده از وبسرویس «تبدیل م» به دست آورده و در bottom sheet نمایش دهیم.
توضیحات داده شده در مورد ساختار درخواست و انواع پاسخهای سرور در بخش Retrofit آورده شده است. همچنین بخشهایی از این کد که نسبت به کد بخش Retrofit تکراری است مجددا توضیح داده نشده است.
-
build.gradle (Module: app): برای استفاده از کتابخانه OkHttp وابستگی زیر را به لیست وابستگی های این فایل اضافه کنید:
implementation 'com.squareup.okhttp3:okhttp:3.10.0'-
APIOkHttp.java: تنها بخش متفاوت در این کد، پیادهسازی متدneshanReverseAPIاست.
ابتدا رشته درخواست ساخته میشود و سپس رشتهای شامل طول و عرض جغرافیایی - که با یک ویرگول از هم جدا شدهاند - ساخته میشود. این رشته زمانی استفاده میشود که آدرس به درستی از وبسرویس دریافت نشود.
یک شی از کلاس Request با نام request ساخته میشود. در هنگام ساختن این شی، در سرآمد کلید API خود را وارد میکنیم و رشته درخواست را نیز به آن میدهیم. سپس بر روی client متد newCall صدا زده میشود و request به عنوان ورودی به آن داده میشود و در نهایت متد enqueue صدا زده شده و یک Callback جدید به عنوان ورودی به آن داده میشود و متدهای onFailure و onResponse پیادهسازی میشوند.
در متد onResponse تمامی کارهایی که در هنگام دریافت جواب از سرور نیاز هست که انجام داده شود، نوشته میشود. در اینجا ابتدا بررسی شده است که آیا جواب موفقیت آمیز بوده است یا خیر و در صورت موفقیت آمیز بودن جواب، اطلاعات مربوط به همسایگی و آدرس از پاسخ استخراج شده و در bottom sheet نمایش داده میشود. در صورتی که آدرس به درستی از سرور دریافت نشود، طول و عرض جغرافیایی نقطه به عنوان آدرس نمایش داده میشود.
private void neshanReverseAPI(LngLat loc) {
String requestURL = "https://api.neshan.org/v1/reverse?lat=" + loc.getY() + "&lng=" + loc.getX();
final String latLngAddr = String.format("%.6f", loc.getY()) + "," + String.format("%.6f", loc.getX());
// adding the created certPinner to OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(certPinner)
.build();
Request request = new Request.Builder()
//TODO: replace "YOUR_API_KEY" with your api key
.header("Api-Key", "YOUR_API_KEY")
.url(requestURL)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
} else {
String neighbourhood = "آدرس نامشخص";
String address = latLngAddr;
try {
String jsonData = response.body().string();
JSONObject obj = new JSONObject(jsonData);
neighbourhood = obj.getString("neighbourhood");
address = obj.getString("address");
// if server was able to return neighbourhood and address to us
if(neighbourhood.equals("null") && address.equals("null")) {
neighbourhood = "آدرس نامشخص";
address = latLngAddr;
}
}
catch (Exception e){
Log.d("nehsnaReverse", Log.getStackTraceString(e));
neighbourhood = "آدرس نامشخص";
address = latLngAddr;
}
finally {
final String fNeighbourhood = neighbourhood;
final String fAddrees = address;
runOnUiThread(new Runnable() {
@Override
public void run() {
addressTitle.setText(fNeighbourhood);
addressDetails.setText(fAddrees);
}
});
}
}
}
});
}