مرجع HttpClient
مرجع HttpClient في أنجولار هو أحد الركائز الأساسية للتعامل مع البيانات الخارجية عبر بروتوكول HTTP داخل تطبيقات الويب الحديثة والتطبيقات أحادية الصفحة (SPA). يوفر HttpClient واجهة قوية وآمنة لإجراء طلبات GET وPOST وPUT وDELETE، مما يمكّن المكونات من التواصل بسلاسة مع الخوادم وAPIs المختلفة. يعتبر فهم مرجع HttpClient أمرًا بالغ الأهمية لأنه يؤثر مباشرة على إدارة الحالة (state management)، تدفق البيانات (data flow)، وحياة المكونات (component lifecycle) داخل أنجولار.
يُستخدم HttpClient عادة في الخدمات (services) لتجريد منطق الاتصال بالخادم عن المكونات، مما يقلل من prop drilling ويعزز إعادة الاستخدام. من خلال دمجه مع RxJS، يمكن إدارة الاستجابات غير المتزامنة بشكل فعال، وتحسين الأداء عبر المعالجات مثل debounceTime، switchMap، وcatchError. سيتعلم القارئ في هذا المرجع كيفية إنشاء مكونات قابلة لإعادة الاستخدام، التعامل مع البيانات الخارجية، تطبيق استراتيجيات إدارة الحالة، وتحسين الأداء ضمن دورة حياة المكونات.
هذا المرجع يربط بين مفاهيم أنجولار الأساسية مثل المكونات، إدارة الحالة، تدفق البيانات، وحياة المكونات وبين التطبيق العملي لHttpClient، مما يتيح للمطورين بناء تطبيقات متقدمة ومرنة تلبي متطلبات المشاريع الحديثة في بيئات SPA وواجهات المستخدم الديناميكية.
مثال أساسي
typescriptimport { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
interface User {
id: number;
name: string;
email: string;
}
@Component({
selector: 'app-user-list',
template: ` <h2>قائمة المستخدمين</h2> <ul> <li *ngFor="let user of users">{{ user.name }} - {{ user.email }}</li> </ul>
`
})
export class UserListComponent implements OnInit {
users: User[] = [];
constructor(private http: HttpClient) {}
ngOnInit(): void {
this.fetchUsers().subscribe({
next: (data) => this.users = data,
error: (err) => console.error('حدث خطأ أثناء جلب البيانات', err)
});
}
fetchUsers(): Observable<User[]> {
return this.http.get<User[]>('[https://jsonplaceholder.typicode.com/users](https://jsonplaceholder.typicode.com/users)');
}
}
في الكود أعلاه، قمنا بإنشاء مكون UserListComponent يعرض قائمة المستخدمين من API خارجي. يتم استخدام HttpClient داخل خدمة fetchUsers لتجريد منطق طلب البيانات عن المكون نفسه، مما يمنع prop drilling ويقلل من تعقيد المكون. عند تشغيل ngOnInit، يقوم المكون بالاشتراك في Observable الذي يعيد قائمة المستخدمين، ويتم تحديث مصفوفة users بشكل آمن.
استخدام subscribe مع معالجات next وerror يسمح بالتحكم في تدفق البيانات وإدارة الأخطاء بشكل واضح، ما يعكس أفضل الممارسات في أنجولار لإدارة الحالة وتحسين تجربة المستخدم. الكود يظهر كيفية دمج lifecycle hooks مثل ngOnInit مع HttpClient لضمان تحميل البيانات عند تهيئة المكون، مع الحفاظ على بنية مكونات قابلة لإعادة الاستخدام وقابلة للاختبار. هذه الطريقة تدعم تدفق البيانات أحادي الاتجاه (unidirectional data flow) وتحسن الأداء من خلال تقليل إعادة التقديم غير الضرورية.
مثال عملي
typescriptimport { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { catchError, retry, throwError, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private apiUrl = '[https://jsonplaceholder.typicode.com/users](https://jsonplaceholder.typicode.com/users)';
constructor(private http: HttpClient) {}
getUsers(): Observable<User[]> {
return this.http.get<User[]>(this.apiUrl).pipe(
retry(2),
catchError(this.handleError)
);
}
private handleError(error: HttpErrorResponse) {
console.error('خطأ HTTP:', error.message);
return throwError(() => new Error('حدث خطأ أثناء الاتصال بالخادم'));
}
}
@Component({
selector: 'app-user-advanced',
template: ` <h2>قائمة المستخدمين المتقدمة</h2> <ul> <li *ngFor="let user of users">{{ user.name }} - {{ user.email }}</li> </ul> <p *ngIf="errorMessage">{{ errorMessage }}</p>
`
})
export class UserAdvancedComponent implements OnInit {
users: User[] = [];
errorMessage = '';
constructor(private userService: UserService) {}
ngOnInit(): void {
this.userService.getUsers().subscribe({
next: (data) => this.users = data,
error: (err) => this.errorMessage = err.message
});
}
}
Advanced أنجولار Implementation
typescriptimport { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { UserService } from './user.service';
import { Observable } from 'rxjs';
import { shareReplay, catchError, of } from 'rxjs';
@Component({
selector: 'app-user-optimized',
template: ` <h2>المستخدمون المحسنون</h2> <ul> <li *ngFor="let user of users$ | async">{{ user.name }} - {{ user.email }}</li> </ul> <p *ngIf="error$ | async as error">{{ error }}</p>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class UserOptimizedComponent implements OnInit {
users$: Observable<User[]> = of([]);
error$: Observable<string> = of('');
constructor(private userService: UserService) {}
ngOnInit(): void {
const data$ = this.userService.getUsers().pipe(
shareReplay(1),
catchError((err) => {
this.error$ = of(err.message);
return of([]);
})
);
this.users$ = data$;
}
}
في المثال المتقدم، نستخدم ChangeDetectionStrategy.OnPush لتحسين الأداء عبر الحد من عمليات إعادة التقديم غير الضرورية. يتم تخزين بيانات المستخدمين في Observable مع shareReplay لضمان مشاركة البيانات بين الاشتراكات المتعددة دون إعادة طلبها من الخادم، ما يحسن الأداء ويقلل الحمل على الشبكة. استخدام catchError يسمح بمعالجة الأخطاء بشكل نظيف دون التأثير على Observable الرئيسي. هذا النمط يعكس ممارسات أنجولار المتقدمة لإدارة الحالة، تدفق البيانات، وتحسين الأداء ضمن lifecycle المكونات.
Code Example 8
المرجع الشاملأنجولار Element/Method|Description|Syntax|Example|Notes
HttpClient|get data from server|http.get<T>(url, options)|this.http.get<User[]>('url')|Returns Observable
HttpClient|post data to server|http.post<T>(url, body, options)|this.http.post<User>('url', user)|Returns Observable
HttpClient|put data on server|http.put<T>(url, body, options)|this.http.put<User>('url', user)|Updates resource
HttpClient|delete data from server|http.delete<T>(url, options)|this.http.delete<User>('url')|Removes resource
HttpClient|patch data on server|http.patch<T>(url, body, options)|this.http.patch<User>('url', {name})|Partial update
HttpClient|get with headers|http.get<T>(url, { headers })|this.http.get<User[]>('url', { headers })|Send custom headers
HttpClient|observe response|http.get<T>(url, { observe })|this.http.get<User[]>('url', { observe: 'response' })|Full HttpResponse
HttpClient|with params|http.get<T>(url, { params })|this.http.get<User[]>('url', { params: {id: '1'} })|Query parameters
HttpClient|responseType|http.get<T>(url, { responseType })|this.http.get('url', { responseType: 'text' })|text, json, blob
HttpClient|withCredentials|http.get<T>(url, { withCredentials })|this.http.get('url', { withCredentials: true })|Send cookies
HttpClientModule|import module|import { HttpClientModule } from '@angular/common/http'|imports: [HttpClientModule]|Required in app module
HttpHeaders|create headers|new HttpHeaders({ key: value })|const headers = new HttpHeaders({ 'Auth': 'token' })|Immutable object
HttpParams|create params|new HttpParams().set('key','value')|const params = new HttpParams().set('id','1')|Immutable object
Observable|handle async|Observable<T>|return this.http.get<User[]>('url')|Subscribe to receive data
catchError|handle errors|pipe(catchError(err => of([])))|this.http.get<User[]>('url').pipe(catchError(...))|Error handling
retry|retry requests|pipe(retry(n))|this.http.get<User[]>('url').pipe(retry(2))|Retries on error
shareReplay|cache observable|pipe(shareReplay(1))|this.http.get<User[]>('url').pipe(shareReplay(1))|Cache latest value
unsubscribe|cancel subscription|subscription.unsubscribe()|const sub = obs.subscribe(); sub.unsubscribe()|Prevent memory leaks
HttpErrorResponse|handle error|error instanceof HttpErrorResponse|if(err instanceof HttpErrorResponse)|HTTP error check
interceptors|modify requests|provide HTTP_INTERCEPTORS|providers: [{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }]|Global request handling
[Continue to fill 80-100 rows following same pattern, covering all HttpClient methods, options, error handling, and common patterns]
📊 Complete أنجولار Properties Reference
Property | Values | Default | Description | أنجولار Support |
---|---|---|---|---|
observe | 'body','events','response' | 'body' | Determines what is returned from HttpClient | Angular 4.3+ |
responseType | 'json','text','blob','arraybuffer' | 'json' | Specifies type of response | Angular 4.3+ |
headers | HttpHeaders | {} | HTTP headers object | Angular 4.3+ |
params | HttpParams | {} | Query parameters | Angular 4.3+ |
withCredentials | boolean | false | Send cookies with request | Angular 4.3+ |
reportProgress | boolean | false | Track request progress | Angular 4.3+ |
observeEvents | boolean | false | Include HTTP events | Angular 5+ |
timeout | number | 0 | Timeout in milliseconds | Angular 6+ |
interceptors | HTTP_INTERCEPTORS | none | Custom request/response interceptors | Angular 4.3+ |
retry | number | 0 | Number of retries on failure | Angular 6+ |
catchError | function | none | Error handling operator | Angular 5+ |
shareReplay | number | 1 | Cache Observable values | Angular 5+ |
ملخصًا، يوفر مرجع HttpClient في أنجولار أدوات قوية لإدارة البيانات الخارجية بطريقة متسقة وفعالة، مع تعزيز مفهوم إدارة الحالة وتدفق البيانات ضمن المكونات. تعلم هذا المرجع يمكّن المطورين من بناء مكونات قابلة لإعادة الاستخدام، تحسين الأداء، ومعالجة الأخطاء بشكل احترافي. من الخطوات التالية دراسة تحسين الأداء باستخدام RxJS operators، إنشاء interceptors مخصصة، وإدارة الحالة باستخدام NgRx أو خدمات BehaviorSubject لتعزيز تجربة التطبيقات المتقدمة. ينصح بالاستمرار في ممارسة الأمثلة العملية، مراجعة المستندات الرسمية، ومتابعة أحدث تحديثات أنجولار لضمان تطبيق أفضل الممارسات في مشاريع حقيقية.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى