في التطوير الحديث، يعد تغليف واجهة برمجة التطبيقات (API) مهارة بالغة الأهمية. يسمح تغليف واجهة برمجة التطبيقات (API) للمطورين بإنشاء تعليمات برمجية أكثر قابلية للقراءة والصيانة والقابلية للتطوير، مما يؤدي في النهاية إلى تحسين كفاءة التطوير. اليوم، سنستكشف كيفية إنشاء غلاف بسيط وفعال في Node.js للتفاعل مع واجهة برمجة تطبيقات Reddit.
عند تطوير التطبيقات التي تتفاعل مع Reddit، يكون الاتصال المباشر بواجهة برمجة التطبيقات ممكنًا ولكنه ليس مثاليًا. إذا كنت تريد أن تكون التعليمات البرمجية الخاصة بك أكثر نمطية وأسهل في الصيانة، فإن تغليف واجهة برمجة التطبيقات أمر ضروري. من خلال تغليف واجهة برمجة التطبيقات، يمكنك:
سنبدأ بفئة Reddit الأساسية، بما في ذلك الوظائف الأساسية اللازمة للتفاعل مع Reddit API، مثل الحصول على رمز الوصول وإجراء استعلامات البحث.
في الكود، نبدأ بتحديد المُنشئ لفئة Reddit. يعد هذا المُنشئ مسؤولاً بشكل أساسي عن تهيئة المعلمات المهمة التي تتطلبها واجهة برمجة تطبيقات Reddit، مثل ClientId وclientSecret وuserAgent وbaseURL الأساسي. يتم استرداد هذه المعلمات من متغيرات البيئة لضمان عدم تشفير المعلومات الحساسة.
export class Reddit { private baseURL: string; private clientId: string; private clientSecret: string; private userAgent: string; private token?: string; constructor() { this.clientId = getEnvironmentVariable('REDDIT_CLIENT_ID')!; this.clientSecret = getEnvironmentVariable('REDDIT_SECRET')!; this.userAgent = getEnvironmentVariable('REDDIT_USER_AGENT')!; this.baseURL = getEnvironmentVariable('REDDIT_BASE_URL')!; } }
يعد إنشاء عنوان URL للطلب جزءًا مهمًا من تغليف واجهة برمجة التطبيقات. نقوم بإنشاء طريقة buildUrl التي تأخذ نقطة نهاية API ومعلمات الخيارات الاختيارية. تقوم هذه الطريقة بتحويل كائن الخيارات إلى سلسلة استعلام URL، مما يشكل عنوان URL الكامل للطلب.
private buildUrl(endpoint: string, options?: RedditSearchOptions): string { const preparedParams: [string, string][] = Object.entries({ ...options }) .filter( ([key, value]) => value !== undefined && value !== null && key !== 'apiKey', ) .map(([key, value]) => [key, `${value}`]); const searchParams = new URLSearchParams(preparedParams); return `${this.baseURL}/${endpoint}?${searchParams}`; }
تتطلب Reddit API OAuth2 للمصادقة، لذلك نحتاج إلى الحصول على رمز وصول أولاً. ترسل طريقة getAccessToken طلب POST لاسترداد رمز الوصول وتخزينه. تم تخزين هذا الرمز المميز مؤقتًا لتجنب الطلبات المتكررة.
private async getAccessToken(): Promise{ if (this.token) return this.token; const auth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString( 'base64', ); const headers = new Headers(); headers.append('Authorization', `Basic ${auth}`); headers.append('Content-Type', 'application/x-www-form-urlencoded'); const response = await fetch(`${this.baseURL}/api/v1/access_token`, { method: 'POST', headers, body: 'grant_type=client_credentials', }); if (!response.ok) { throw new Error(`Error fetching access token: ${response.statusText}`); } const data = (await response.json()) as { access_token: string; }; this.token = data.access_token; return this.token; }
طريقة الاستدعاء هي وظيفة استدعاء عامة لواجهة برمجة التطبيقات (API). فهو يحصل أولاً على رمز الوصول، ثم ينشئ عنوان URL للطلب، وأخيرًا يقدم الطلب ويتعامل مع الاستجابة. إذا فشل طلب واجهة برمجة التطبيقات (API)، فسيؤدي ذلك إلى حدوث خطأ، مما يسمح لك بمعالجة الأخطاء بشكل موحد عند استخدام هذا المجمع.
private async invoke( endpoint: string, options?: RedditSearchOptions, ): Promise { const token = await this.getAccessToken(); const headers = new Headers(); headers.append('Authorization', `Bearer ${token}`); headers.append('User-Agent', this.userAgent); const response = await fetch(this.buildUrl(endpoint, options), { method: 'GET', headers, }); if (!response.ok) { throw new Error(`Error fetching data: ${response.statusText}`); } return (await response.json()) as T; }
أخيرًا، نستخدم طريقة findMany لتنفيذ طلبات البحث. تسمح هذه الطريقة للمستخدمين بالبحث بناءً على سلسلة استعلام ومعلمات اختيارية أخرى، مما يؤدي إلى عرض نتائج البحث.
public async findMany( q: string, options: RedditSearchOptions = {}, ): Promise{ return this.invoke('/search', { ...options, q }); }
من خلال هذا المنشور، تعلمنا كيفية تغليف Reddit API، مما يجعل استدعاءات API أكثر وضوحًا وقابلية للصيانة. لا تنطبق طريقة الالتفاف هذه على Reddit فحسب، بل تنطبق أيضًا على معظم التطبيقات التي تتفاعل بشكل متكرر مع واجهات برمجة التطبيقات الخارجية. يعمل الكود المغلف على تحسين إمكانية إعادة الاستخدام ويوفر راحة كبيرة للتوسع والصيانة المستقبلية.
في المشاريع الفعلية، يمكن أن تتضمن التحسينات الإضافية إضافة معالجة أكثر تفصيلاً للأخطاء، أو دعم ميزات واجهة برمجة التطبيقات الإضافية، أو إنشاء طبقة تخزين مؤقت لتحسين الأداء. ومع ذلك، فإن إتقان أساسيات التغليف يعد مهارة أساسية لكل مطور. أتمنى من خلال هذه التدوينة أن تتمكن من تطبيق هذه التقنيات في عملك لكتابة كود أكثر أناقة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3