Я кодирую модифицированную версию учебника AngularDart. Я добавляю вызов сервера на основе примера в Руководстве разработчика/HTTP-клиенте. Вместо службы памяти я пытаюсь подключиться к реальному серверу на той же машине. Я заставил его работать в простом Dart, используя HTTPRequest в моем приложении Rails. В моем новом автономном клиенте AngularDart я получаю сообщение об ошибке:
TypeError: this.get$BrowserClient is not a function
Я подозреваю, что это может происходить из-за того, что я никогда не создавал сервер в памяти в main.dart. Если да, то какой правильный код для общения с реальным сервером?
Мой класс обслуживания:
import 'dart:async';
import 'dart:convert';
import 'package:angular2/core.dart';
import 'artist.dart';
import 'package:http/browser_client.dart';
import 'package:http/http.dart';
@Injectable()
class ArtistService {
static const _artistsUrl = 'http://jazzcatold.loc/artists?page=1'; // URL to RAILS server
final BrowserClient _http;
ArtistService(this._http);
Future<List<Artist>> getArtists() async {
try {
final response = await _http.get(_artistsUrl,
headers: {'Accept': 'application/json'});
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
return artists;
} catch (e) {
throw _handleError(e);
}
}
...
Мой main.dart:
import 'package:angular2/platform/browser.dart';
import 'package:jazzcat/app_component.dart';
main() {
bootstrap(AppComponent);
}
В примере есть:
import 'package:angular2/core.dart';
import 'package:angular2/platform/browser.dart';
import 'package:http/browser_client.dart';
import 'package:server_communication/app_component.dart';
import "package:server_communication/hero_data.dart";
void main() {
bootstrap(AppComponent, const [
// in-memory web api provider
const Provider(BrowserClient,
useFactory: HttpClientBackendServiceFactory, deps: const [])
// TODO: drop `deps` once fix lands for
// https://github.com/angular/angular/issues/5266
]);
}
План B
Я попробовал это по приведенной ссылке:
import 'package:http/http.dart' as http;
@Injectable()
class ArtistService {
static const _artistsUrl = 'http://jazzcatold.loc/artists?page=1'; // URL to RAILS server
Future<List<Artist>> getArtists() async {
final response = await http.get(_artistsUrl, headers: {'Accept': 'application/json'});
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
return artists;
}
Я получил ошибку:
EXCEPTION: Unsupported operation: IOClient isn't supported on this platform.
План С
Я изменил рабочий код из другого проекта:
import 'dart:html';
@Injectable()
class ArtistService {
static const _artistsUrl = 'http://jazzcatold.loc/artists?page=1'; // URL to RAILS server
Map headers = {'Accept': 'application/json'};
Future<List<Artist>> getArtists() async {
final response = await HttpRequest.request(_artistsUrl, requestHeaders: headers);
final artists = _extractData(response)
.map((value) => new Artist.fromJson(value))
.toList();
return artists;
}
Когда я проверяю сетевые данные в инспекторе Chrome, я вижу возвращаемые данные JSON. Я получаю сообщение об ошибке:
html_dart2js.dart:3352 EXCEPTION: NoSuchMethodError: method not found: 'get$body' (J.getInterceptor$x(...).get$body is not a function)
Код может не подходить для структуры getArtists.