ОБНОВЛЕНИЕ: для rxjs> v5.5
Как упоминалось в некоторых комментариях и других ответах, по умолчанию HttpClient десериализует содержимое ответа в объект. Некоторые из его методов позволяют передавать аргумент универсального типа, чтобы утвердительно набрать результат. Вот почему больше нет json()
метода.
import {throwError} from 'rxjs';
import {catchError, map} from 'rxjs/operators';
export interface Order {
// Properties
}
interface ResponseOrders {
results: Order[];
}
@Injectable()
export class FooService {
ctor(private http: HttpClient){}
fetch(startIndex: number, limit: number): Observable {
let params = new HttpParams();
params = params.set('startIndex',startIndex.toString()).set('limit',limit.toString());
// base URL should not have ? in it at the en
return this.http.get(this.baseUrl,{
params
}).pipe(
map(res => res.results || []),
catchError(error => _throwError(error.message || error))
);
}
Обратите внимание, что вы можете легко преобразовать возвращенный Observable
в Promise
, просто вызвав toPromise()
.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
В вашем случае вы можете
Предполагая, что ваш бэкэнд возвращает что-то вроде:
{results: [{},{}]}
в формате JSON, где каждый {} является сериализованным объектом, вам потребуется следующее:
// Somewhere in your src folder
export interface Order {
// Properties
}
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Order } from 'somewhere_in_src';
@Injectable()
export class FooService {
ctor(private http: HttpClient){}
fetch(startIndex: number, limit: number): Observable {
let params = new HttpParams();
params = params.set('startIndex',startIndex.toString()).set('limit',limit.toString());
// base URL should not have ? in it at the en
return this.http.get(this.baseUrl,{
params
})
.map(res => res.results as Order[] || []);
// in case that the property results in the res POJO doesnt exist (res.results returns null) then return empty array ([])
}
}
Я удалил секцию catch, так как она может быть заархивирована через перехватчик HTTP. Проверьте документы . Например:
https://gist.github.com/jotatoledo/765c7f6d8a755613cafca97e83313b90
И чтобы потреблять, вам просто нужно назвать его как:
// In some component for example
this.fooService.fetch(...).subscribe(data => ...); // data is Order[]
Вы хотите использовать № 2.
Используйте Google OpenID для аутентификации того, что они владеют определенной учетной записью Google. Используйте OpenAuth, чтобы получить разрешение на добавление и удаление событий.
Еще лучше - просто создайте событие календаря в своем приложении и откройте канал iCal. Таким образом, люди смогут использовать эти календари в любом количестве других приложений.
Ваша «нежелательная альтернатива № 2» не так уж нежелательна, поскольку Google поддерживает OpenID / OpenAuth протокол. Это означает, что пользователь может не только войти в вашу службу, используя учетные данные Google, но и предоставить вам разрешения на доступ к своему календарю Google.
Ни в коем случае вам не придется создавать учетные записи Google за кулисами. Для получения дополнительной информации проверьте открытые страницы Google