آموزش OkHTTP در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش OkHTTP در برنامه نویسی اندروید می پردازیم در پست های قبلی مزیت های مربوط به okhttp را بیان کردیم در ادامه نحوه استفاده از کتاب خانه okhttp خواهیم پرداخت در ادامه با ما همراه باشید.
از لینک زیر می توانید از مطبی قبلی استفاده کنید.
OkHTTP چیست ؟
ابتدا باید کتاب خانه مربوط به Okhttp را به پروژه اضافه کنید.
وارد فایل build.gradle از نوع Module شده سپس در بخش dependency اضافه کنید.
1 | compile 'com.squareup.okhttp3:okhttp:3.4.1' |
پروژه را sync کنید.
وارد فایل AndroidManifest.xml شده سپس دسترسی اینترنت زیر را اضافه کنید.
1 | <uses-permission android:name="android.permission.INTERNET"/> |
بعد از اینکه دسترسی را اضافه کردید.
اگر مطلب قبلی را خوانده باشید دو نوع برای انجام درخواست وجود دارد (Synchronous و Asynchronous )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity { OkHttpClient client = new OkHttpClient(); TextView txtString; public String url= "https://reqres.in/api/users/2"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtString= (TextView)findViewById(R.id.txtString); OkHttpHandler okHttpHandler= new OkHttpHandler(); okHttpHandler.execute(url); } public class OkHttpHandler extends AsyncTask { OkHttpClient client = new OkHttpClient(); @Override protected String doInBackground(String...params) { Request.Builder builder = new Request.Builder(); builder.url(params[0]); Request request = builder.build(); try { Response response = client.newCall(request).execute(); return response.body().string(); }catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); txtString.setText(s); } } } |
در بالا ما با استفاده از okhttp درخواست را به یک url ارسال کردیم url مورد نظر شامل یک json است که شامل مقادیری می باشد (می توانید لینک آن را بررسی کنید). در بالا ابتدا باید از OkHttpClient یک instance ساختیم خود آن را در async قرار دادیم (از async بالا extend شده است) تا عمل request به صورت Synchronous انجام شود.
نمونه مثالی برای Asynchronous
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package ir.programchi; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity { TextView txtString; public String url= "https://reqres.in/api/users/2"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtString= (TextView)findViewById(R.id.txtString); try { run(); } catch (IOException e) { e.printStackTrace(); } } void run() throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { call.cancel(); } @Override public void onResponse(Call call, Response response) throws IOException { final String myResponse = response.body().string(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { txtString.setText(myResponse); } }); } }); } } |
در بالا از کلاس async استفاده نشده است و عمل request به صورت Asynchronous انجام می شود. در بالا در void به نام onResponse نتیجه یا result برمیگردد .
اگر می خواهید مقدار یا پارامتری به سرور ارسال کنید می توانید از زیر استفاده کنید.
1 2 3 4 5 6 7 | HttpUrl.Builder urlBuilder = HttpUrl.parse("https://httpbin.org/get).newBuilder(); urlBuilder.addQueryParameter("website", "www.programchi.ir"); urlBuilder.addQueryParameter("example", "android"); String url = urlBuilder.build().toString(); Request request = new Request.Builder() .url(url) .build(); |
در بالا ما دو مقدار که مقداری key آن برابر با website و example است با مقدار وبسایت سایت پر شده است و مقدار دومی برابر با اندروید است.
اگر می خواید OkHttp را با header سفارشی ارسال کنید می توانید مثل زیر عمل کنید.
1 2 3 4 | Request request = new Request.Builder() .header("Authorization", "replace this text with your token") .url("your api url") .build(); |
در بالا مثلا ما می خواستیم عمل اعتبار سنجی را با سرور انجام دهیم از Header استفاده کرده ایم.
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
سلام عزیز. بنده سی شارپ کار هستم و تازه جاوا رو شروع کردم. (بیوگرافیتون هم خوندم چون به هر دو زبان تسلط داریئ پس بهتر حرفامو متوجه میشید)
ببین عزیز ما توی سی شارپ از async/await استفاده میکردیم و منتظر میموندیم تا جواب از سرور بگیریم و بعد ما مثلا جیسون گرفته شده رو از تابع ریترن میکردیم.
حالا توی جاوا هم من دقیقا همینو میخوام.. توی نت که سرچ کردم دیدم باید برای این کار اینترفیس بسازیم که جواب رو توی یه تابع دیگه به ما برگردونه که واقعا این کار برای چیزی که من میخوام کار اضافی و مشکل ساز هست.. (چون بنده دارم یه کتابخونه سی شارپ رو برای جاوا پورت میکنم باید توابع متد خروجی هم داشته باشند نه اینکه برای هر کدوم بیام اینترفیس جدا بسازم و بعد کاربر بیاد ایمپلمنتش کنه و…)
میشه محبت کنید یه نمونه تابع توی جاوا اندروید بسازید که ریسپانس گرفته شده از سرور رو (جیسون) از همون تابع به صورت استرینگ خارج کنه؟ (بدون استفاده از اینترفیس و اونت و تابعی دیگه).
منتظر جوابتون هستم. مرسی.