Dart не может получить доступ к облачному API конечной точки

Это расстраивает, и я застрял здесь на одну неделю и понятия не имею, как это исправить; (

Вдохновлен великолепной работой Гервина Штурма (https://github.com/Scarygami/gdg-endpoint-demo), и вместо этого мне нравится создавать серверную часть Java.

Но, к сожалению, каждый раз, когда я пытаюсь вызвать API конечных точек, возникает ошибка NoSuchMethodError.

Exception: NoSuchMethodError : method not found: '_client@0x296594a'
Receiver: Instance of 'Dbentryendpoint'
Arguments: []
Stack Trace: #0      Object.noSuchMethod (dart:core-patch:1737:25)
#1      Dbentryendpoint.listDBEntry (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/packages/google_dbentryendpoint_v1_api/src/browser/dbentryendpoint.dart:162:16)
#2      main.fetch (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:24:20)
#3      main (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:64:8)

Exception: NoSuchMethodError : method not found: '_client@0x296594a'
Receiver: Instance of 'Dbentryendpoint'
Arguments: []
Stack Trace: #0      Object.noSuchMethod (dart:core-patch:1737:25)
#1      Dbentryendpoint.insertDBEntry (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/packages/google_dbentryendpoint_v1_api/src/browser/dbentryendpoint.dart:124:16)
#2      main.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:56:28)

исходный код demo.dart практически идентичен оригинальному (https://github.com/Scarygami/gdg-endpoint-demo), и я меняю только API cloudendpint и идентификатор веб-клиента.

import "dart:html";
import 'packages/google_dbentryendpoint_v1_api/dbentryendpoint_v1_api_browser.dart' as gdglib;
import 'packages/google_plus_v1_api/plus_v1_api_browser.dart' as pluslib;
import 'packages/google_oauth2_client/google_oauth2_browser.dart';

final CLIENT_ID = "878766780041.apps.googleusercontent.com";
final SCOPES = ["https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/plus.me"];

void main() {
  var auth = new GoogleOAuth2(CLIENT_ID, SCOPES);
  var gdg = new gdglib.Dbentryendpoint(auth);
  var plus = new pluslib.Plus(auth);
  var container = query("#entries");
  var loginButton = query("#login");
  var sendButton = query("#send");
  InputElement textInput = query("#text");
  var authorSpan = query("#author");
  pluslib.Person me;


  void fetch() {
    //gdg.makeAuthRequests = false;
    gdg.makeAuthRequests = true;
    gdg.listDBEntry(limit:10).then((l) {
      container.text = "";
      if (l.items != null) {
        l.items.forEach((e) {
          var p = new ParagraphElement();
          var date = e.date.replaceAll("T", " ");
          p.text = "$date - ${e.author}: ${e.text}";
          container.append(p);
        });
      }
    });
  }

  loginButton.onClick.listen((Event e) {
    auth.login().then((token) {
      loginButton.style.display = "none";
      plus.makeAuthRequests = true;
      plus.people.get("me").then((p) {
        me = p;
        authorSpan.text = "${me.displayName}:";
        authorSpan.style.display = "inline-block";
        textInput.style.display = "inline-block";
        sendButton.style.display = "inline-block";

        sendButton.onClick.listen((Event e) {
          var text = textInput.value;
          textInput.value = "";
          var entry = new gdglib.DBEntry.fromJson({
            "author": me.displayName,
            "text": text
          });
          gdg.makeAuthRequests = true;
          gdg.insertDBEntry(entry).then((entry) {
            fetch();
          });
        });
      });
    });
  });

на стороне Google App Engine я автоматически генерирую класс конечной точки облака с помощью GPE, а затем добавляю информацию, связанную с идентификатором клиента:

@Api(name = "dbentryendpoint",
        clientIds={Ids.WEB_CLIENT_ID,com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
        scopes={"https://www.googleapis.com/auth/userinfo.email"}
)
public class DBEntryEndpoint {
.....

Благодарим за любую помощь!


person Vincent Zhou    schedule 05.03.2013    source источник


Ответы (2)


Я думаю, что понял, как обойти это, но я не знаю, почему:

  1. «создание облачных конечных точек» GPE не генерирует путь, например, он генерирует метод listEntities, а не entity.list
  2. путь необходим для генерации ресурса в _ah/api/discovery/v1/apis/dbentryendpoint/v1/rest; без пути есть только схемы и методы, а не схемы и ресурсы
  3. без ресурсов генератор клиента Dart экспортирует только пустой файл resouces.dart в папку /commom. и методы будут находиться внутри entityEndpoints.dart, который не может правильно распознать _client(), который определен в client.dart в /common.

Таким образом, demo.dart не может найти метод.

Вопрос: зачем нужен путь? поскольку GPE не генерирует путь автоматически, можем ли мы создать правильный файл клиента dart, не добавляя путь вручную в файл движка приложения Google? Спасибо.

person Vincent Zhou    schedule 05.03.2013
comment
Не могли бы вы поделиться документом об открытии? Потому что генератор должен на самом деле иметь возможность обрабатывать методы без ресурсов, так что там может быть ошибка. - person Scarygami; 06.03.2013
comment
Конечно. вот вам cloudsmart9.appspot.com/_ah/api/discovery/v1/apis и cloudsmart9.appspot.com/_ah /api/discovery/v1/apis/ - person Vincent Zhou; 06.03.2013
comment
Я вижу, что теперь у вас есть ресурсы в документе обнаружения. Вы изменили код конечной точки, чтобы включить пути? Если вы создадите клиентскую библиотеку из этого документа, вы сможете использовать lib.entries.getDBEntry lib.entries.listDBEntry и т. д. - person Scarygami; 08.03.2013
comment
Извините, я забыл изменить обратно. вот правильный. Схемы и методы cloudsmart9.appspot.com/_ah/api /discovery/v1/apis/ - person Vincent Zhou; 09.03.2013

Импорт пакета выглядит неправильно, попробуйте это.

import 'packages:google_dbentryendpoint_v1_api/dbentryendpoint_v1_api_browser.dart' as gdglib;
import 'packages:google_plus_v1_api/plus_v1_api_browser.dart' as pluslib;
import 'packages:google_oauth2_client/google_oauth2_browser.dart';
person adam-singer    schedule 05.03.2013
comment
Спасибо за быстрый ответ. но это не работает; (Но я обнаружил странную вещь: при доступе: original, вы можете найти схемы и ресурсы, но если вы получите доступ к myApp, есть схемы и методы, а не ресурсы! при создании клиента dart файл resources.dart в /common является пустым! Является ли это причиной? - person Vincent Zhou; 06.03.2013
comment
для моего приложения я просто использую значение по умолчанию при создании класса облачных конечных точек, поэтому имя метода: listDBEntry(), и я обнаружил, что имя матода — это пример Гервина:entries.list. зачем определять путь к записям? Спасибо. - person Vincent Zhou; 06.03.2013