استخدام التحديث التحديثي 2 في تطبيق Android

استخدام التحديث التحديثي 2 في تطبيق Android


Retrofit هي مكتبة معروفة بين مطوري Android للشبكات ، حتى أن البعض يعتبرها معيارًا بطريقة ما. هناك الكثير من الأسباب لمثل هذه الشعبية: تدعم المكتبة تمامًا واجهة برمجة تطبيقات REST ، ويتم اختبارها وتكوينها بسهولة ، ويتم تنفيذ الطلبات عبر الشبكة بمساعدتها بكل بساطة. في هذه المقالة ، سأوضح لك كيفية تكوين Retrofit واستخدامه لتنفيذ الشبكات مع تطبيقك.


تكوين التحديثية


أضف التبعية التالية إلى ملف build.gradle :


 implementation 'com.squareup.retrofit2:retrofit:2.4.0' 

سنستخدم Gson لتحويل JSON إلى POJO. توفر التحديثية تبعية تحول تلقائيًا JSON إلى POJO. للقيام بذلك ، قم بإضافة تبعية أخرى إلى ملف build.gradle :


 implementation 'com.squareup.retrofit2:converter-gson:2.3.0' 

إذا لم يُسمح لتطبيقك حتى الآن بالعمل مع الشبكة ، فتأكد من إضافة السطر المقابل إلى ملف AndroidManifest :


 <uses-permission android:name="android.permission.INTERNET"/> 

بعد إضافة التبعيات ، نحتاج إلى كتابة التعليمات البرمجية لتكوين مكتبة التحديث التحديثي.


قم بإنشاء فئة تسمى NetworkService :


 public class NetworkService { } 

يجب أن تكون هذه الفئة كائنًا فرديًا ، لذلك قم بتعريف متغير ثابت ووظيفة تقوم بإنشاء وإرجاع متغير من نفس نوع الفئة. إذا كنت لا تعرف كيف يعمل هذا النمط ، فراجع هذه المقالة التي تحتوي على أمثلة تنفيذ Java.


 public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

للاختبار ، نستخدم حامل JSONPlaceholder ، الذي يوفر واجهة برمجة تطبيقات وهمية REST API للمطورين:


 https://jsonplaceholder.typicode.com 

الآن سنعلن عن تهيئة التحديث في مُنشئ NetworkService :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

اكتمل التكوين ، والآن نحتاج إلى تحديد نقاط النهاية التي ستعرض البيانات.


إضافة نقاط النهاية


أنشئ واجهة باسم JSONPlaceHolderApi :


 public interface JSONPlaceHolderApi { } 

على موقع JSONPlaceHolder ، يعد عنوان URL /posts/id نقطة النهاية التي تُرجع رسالة بها المعرف المناسب. تتلقى نقطة النهاية هذه طلب GET وترجع البيانات بتنسيق JSON على النحو التالي:


 { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } 

أولاً ، سننشئ POJO المناسب لاستجابة JSON:


 public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } } 

كما ترون ، هذه فئة POJO بسيطة. قمنا @SerializedName() المتغيرات باستخدام @SerializedName() ، لتمرير الاسم هناك. هذه الأسماء هي في الواقع مفاتيح في بيانات JSON التي تم إرجاعها من واجهة برمجة التطبيقات ، لذا يمكنك تغيير اسم المتغير كما تريد ، ولكن تأكد من أن الاسم الذي تم تمريره إلى التعليق التوضيحي @SerializedName() موجود تمامًا في JSON.


في الواجهة التي تم إنشاؤها أعلاه ، حدد نقاط النهاية بالمعلمات المطلوبة:


 public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); } 

نظرًا لأننا نرسل طلب GET ، نحتاج إلى تطبيق التعليق التوضيحي @GET على الطريقة ، التي تمثل نقطة النهاية التي نريد إرسال الطلب إليها. كما ترى ، نحن لا نضيف عنوان URL الكامل ، مثل ستأخذ التحديثية تلقائيًا BASE_URL تم تمريرها إلى فئة NetworkService وإضافتها إلى بقية عنوان URL.


يسمى نوع الإرجاع للطريقة Call<Post> . Call هي فئة توفرها المكتبة نفسها مباشرة. ويجب أن تُرجع جميع الأساليب في الواجهة قيمًا من هذا النوع. هذه فئة عامة تأخذ نوع الكائن الذي نريد تحويله إلى JSON. مررنا بسبب هذا هو بالضبط الكائن الذي نريد تحويل استجابة JSON إليه. قمنا بتمرير عدد صحيح إلى المعلمات @Path تعليق توضيحي له باستخدام @Path ، الذي كتبنا فيه id . ستأخذ عملية التعديل التحديثي هذه القيمة وعند نقطة النهاية ستستبدل {id} . وبالتالي ، إذا مررنا القيمة 1 كمعلمة ، فستبدو نقطة النهاية مثل هذه /posts/1 ، إذا تجاوزنا القيمة 10 ، فستكون نقطة النهاية هي /posts/10 .


الآن نحن بحاجة إلى التحديثية لتوفير تنفيذ واجهة JSONPlaceHolderApi . للقيام بذلك ، استخدم الأسلوب create() :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

بعد ذلك ، تحتاج إلى الحصول على JSONPlaceHolderApi من NetworkService وإرسال طلب:


 NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) { Post post = response.body(); textView.append(post.getId() + "\n"); textView.append(post.getUserId() + "\n"); textView.append(post.getTitle() + "\n"); textView.append(post.getBody() + "\n"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } }); 

يحتوي كائن Call إرجاعه على طريقة تسمى enqueue ، والتي تأخذ Callback<T> كمعلمة. في onResponse نحصل على نتيجة Response<Post> التي تحتوي على كائن Post إرجاعه من الخادم. للحصول على كائن Post نفسه ، نستخدم أسلوب response.body() . بقية الشفرة مفهومة دون مزيد من التوضيح.


إرسال أنواع مختلفة من الطلبات


JSONPlaceHolder واجهة برمجة تطبيقات JSONPlaceHolder على العديد من نقاط النهاية المختلفة التي يمكنك استخدامها.


الحصول على قائمة الرسائل


 @GET("/posts") public Call<List<Post>> getAllPosts(); 

للحصول على قائمة بجميع الرسائل ، قمنا بتغيير نقطة النهاية ونوع نوع الوظيفة.


إرسال الطلب مع المعلمة


إذا كنت تريد إرسال طلب بمعلمة ، @Query() عليك سوى استخدام التعليق التوضيحي @Query() للمعلمة المقابلة في الطريقة:


 @GET("/posts") public Call<List<Post>> getPostOfUser(@Query("userId") int id); 

لذلك ، إذا قمنا بتمرير القيمة 6 في معلمة الطريقة ، فستكون نقطة النهاية التالية - /posts?userId=6 .


إرسال طلب POST


لإرسال طلب POST ، ما عليك سوى تغيير التعليق التوضيحي للطريقة.


 @POST("/posts") public Call<Post> postData(@Body Post data); 

لتكوين نص الطلب لهذه الطريقة ، نستخدم التعليق التوضيحي @Body للمعلمة التي تم تمريرها. سيستخدم التحديث التحديثي Gson لتحويل @Body إلى JSON.


هناك عدة أنواع مختلفة من الاستعلامات التي يمكنك استخدامها ، ولكن هذا موضوع لمقال منفصل.


طلب اعتراض


يوفر التحديثية طريقة لاعتراض الطلبات وتسجيلها في Logcat. لنقم بإعداد اعتراض ونلقي نظرة على هذا السحر. أضف التبعية التالية إلى ملف build.gradle :


 implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0' 

قم بتحديث فئة NetworkService بهذه الطريقة:


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder client = new OkHttpClient.Builder() .addInterceptor(interceptor); mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client.build()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

الآن ، عند إرسال أو تلقي طلب ، سيتم عرض جميع بياناته ، بما في ذلك عناوين URL ، والعناوين ، والنص ، في السجل:


 D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } <-- END HTTP (292-byte body) 

بهذا نختتم مقالنا. يمكنك العثور على رمز هذا المشروع على GitHub .

Source: https://habr.com/ru/post/ar429058/


All Articles