Получение: TypeError: this.get$BrowserClient не является функцией

Я кодирую модифицированную версию учебника 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.


person curt    schedule 20.06.2016    source источник


Ответы (2)


Вы не можете импортировать http/browser_client.dart в отдельное приложение. Это должно использоваться только для браузерных приложений.

См. https://pub.dartlang.org/packages/http примеры использования для автономные приложения.

person Günter Zöchbauer    schedule 20.06.2016
comment
Под самостоятельным я имел в виду не часть приложения Ruby on Rails. Я запускаю это так же, как учебник. Я вызываю localhost: 8080 в Chrome с запущенным пабом. Это все еще отдельное приложение? - person curt; 20.06.2016
comment
Standalone — это консольное приложение, которое вы запускаете из командной строки, а не в браузере. - person Günter Zöchbauer; 21.06.2016

Ответ — рабочая версия Плана C выше.

import 'dart:async';
import 'dart:convert';
import 'package:angular2/core.dart';

import 'artist.dart';
import 'dart:html';


@Injectable()

class ArtistService {
  static const url = 'http://jazzcatold.loc/artists?page=1'; // URL to RAILS server
  Map headers = {'Accept': 'application/json'};

  Future<List<Artist>> getArtists() async {
    HttpRequest response = await HttpRequest.request(url, requestHeaders: headers);
    List data = JSON.decode(response.responseText);
    final artists = data
          .map((value) => new Artist.fromJson(value))
          .toList();
    return artists;
  }

Я свернул метод _extractData в этот. Я также закодировал его более точно, основываясь на совете Гюнтера в другом месте. Ошибка getBody выше была в методе extractData, который не показан.

person curt    schedule 21.06.2016