2016-06-20 12 views
1

Ich folge this example aber versuche verschiedene URLs zu verschiedenen Schriften zur Karte funktioniert dieses Beispiel, in dem die URL einfach istgoogle Endpunkt-URL-Mapping in app.yaml

- url: /_ah/spi/.* 
    script: test.api 

ich URLs mit verschiedenen Pfaden zur Karte versuchen nach der Standard "/ _ah/spi /". für z. test, utils.

- url: /_ah/spi/test/.* 
    script: test.api 

- url: /_ah/spi/utils/.* 
    script: utils.api 

Dies funktioniert nicht einmal mit nur einem URL-Handler. Ich bekomme einen Pfadfehler nicht gefunden.

Ich kann keine Beispiele wie diese finden und frage mich, ob es möglich ist, URL-Mapping so mit Google-Endpunkten zu verwenden.

Ich versuche dies auf meiner lokalen Entwicklungsumgebung.

Fehler Ich erhalte ist

INFO  2016-06-21 10:48:56,273 module.py:788] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 404 - 
INFO  2016-06-21 10:48:56,274 module.py:788] default: "GET /_ah/api/test/test/v1/simple-test HTTP/1.1" 500 60 

Endpoint Code in test.py ist

class Message(messages.Message): 
    name = messages.StringField(1) 

@endpoints.api(name='test', version='v1') 
class TestApi(remote.Service): 

    """ Simple api test """ 
    @endpoints.method(
     message_types.VoidMessage, 
     Message, 
     path='simple-test', 
     http_method='GET', 
     name='simple-test') 
    def simple_test(self, unused_request): 
     print("simple-test") 
     return Message(name='test simple-test') 

#Start the api server 
api = endpoints.api_server([TestApi]) 

config in app.yaml ist

handlers: 
- url: /_ah/spi/test/.* 
    script: test.api 

ich Postbote bin mit und die URL ist


+1

Fehler anzeigen. –

+0

Ich habe mit Fehlern und meinem Code aktualisiert, danke für die Suche. – Ryan

Antwort

0

Haftungsausschluss - ich nicht den Backend-Service noch verwendet habe, ist die Antwort in erster Linie auf der Dokumentation basiert, nämlich Creating an API Implemented with Multiple Classes

Es scheint, dass Multi-Class-APIs noch ein einzelnen Endpunkte Mapping in app.yaml verwenden, entsprechend der Sammlung aller API-Klassen. Von der app.yaml Datei im Github example:

handlers: 
# The endpoints handler must be mapped to /_ah/spi. 
# Apps send requests to /_ah/api, but the endpoints service handles mapping 
# those requests to /_ah/spi. 
- url: /_ah/spi/.* 
    script: main.api 

Der /_ah/spi/BackendService.getApiConfigs Pfad in dem ersten Fehler, Sie bekommen die Unfähigkeit des Backend-Service schlägt die Back-End-Konfiguration zu erhalten (von denen jedes einzelnen Klasse-Mapping erhalten werden würde), was dem Fehlen dieser einzigen Zuordnung entsprechen würde.

Sie möglicherweise in der Lage sein, Ihre Backend-Klassen in mehrere Dateien zu teilen, können Sie den folgenden Ansatz verwenden.

Eine einzelne/zentrale Backend enpoints Eintrag Datei wird in app.yaml angegeben:

import endpoints 

from backend1 import api_1 
from backend2 import api_2 

api = endpoints.api_server([api_1, api_2]) 

Und diese Dateien enthalten die jeweiligen:

# The endpoints handler must be mapped to /_ah/spi. 
# Apps send requests to /_ah/api, but the endpoints service handles mapping 
# those requests to /_ah/spi. 
- url: /_ah/spi/.* 
    script: backend.api 

Die entsprechende backend.py Datei einfach die aktuellen APIs aus anderen Dateien speichert API-Implementierungen (Kopieren/Einfügen aus dem github-Beispiel und leicht modifiziert für einen schnellen Test):

Die backend1.py Datei:

import endpoints 
from protorpc import messages 
from protorpc import remote 


class Request(messages.Message): 
    message = messages.StringField(1) 


class Response(messages.Message): 
    message = messages.StringField(1) 


api_1 = endpoints.api(name='library1', version='v1.0') 


@api_1.api_class(resource_name='shelves') 
class Shelves1(remote.Service): 

    @endpoints.method(Request, Response, path='list') 
    def list(self, request): 
     return Response() 


# [START books] 
@api_1.api_class(resource_name='books', path='books') 
class Books1(remote.Service): 

    @endpoints.method(Request, Response, path='bookmark') 
    def bookmark(self, request): 
     return Response() 

Die backend2.py Datei:

import endpoints 
from protorpc import messages 
from protorpc import remote 


class Request(messages.Message): 
    message = messages.StringField(1) 


class Response(messages.Message): 
    message = messages.StringField(1) 


api_2 = endpoints.api(name='library2', version='v2.0') 


@api_2.api_class(resource_name='shelves') 
class Shelves2(remote.Service): 

    @endpoints.method(Request, Response, path='list') 
    def list(self, request): 
     return Response() 


# [START books] 
@api_2.api_class(resource_name='books', path='books') 
class Books2(remote.Service): 

    @endpoints.method(Request, Response, path='bookmark') 
    def bookmark(self, request): 
     return Response() 

Mit dem obigen Code ich in der Lage war, den 2-APIs in dem Entwicklungs-Server-API-Explorer, um zu sehen:

enter image description here

Die folgenden Protokolle wurden erstellt:

INFO  2016-06-21 15:52:24,945 module.py:812] default: "GET /_ah/api/static/proxy.html?jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.pEvOgGtQ_zc.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCNv5bf7XiPy_xHPlP3A3K73m3QR2A HTTP/1.1" 200 8015 
INFO  2016-06-21 15:52:25,058 module.py:812] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 5459 
INFO  2016-06-21 15:52:25,070 module.py:812] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 5459 
INFO  2016-06-21 15:52:25,470 module.py:812] default: "GET /_ah/api/discovery/v1/apis HTTP/1.1" 200 1516 
INFO  2016-06-21 15:52:25,508 module.py:812] default: "GET /_ah/api/discovery/v1/apis HTTP/1.1" 200 1516 
INFO  2016-06-21 15:52:25,813 module.py:812] default: "GET /_ah/api/static/proxy.html?jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.pEvOgGtQ_zc.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCNv5bf7XiPy_xHPlP3A3K73m3QR2A HTTP/1.1" 200 8015 
INFO  2016-06-21 15:52:25,937 module.py:812] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 5459 
INFO  2016-06-21 15:52:25,941 module.py:812] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 5459 
INFO  2016-06-21 15:52:25,942 module.py:812] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 5459 
INFO  2016-06-21 15:52:26,183 module.py:812] default: "GET /_ah/api/discovery/v1/apis/library2/v2.0/rest HTTP/1.1" 200 3277 
INFO  2016-06-21 15:52:26,203 module.py:812] default: "GET /_ah/api/discovery/v1/apis/library1/v1.0/rest HTTP/1.1" 200 3277 
INFO  2016-06-21 15:52:26,210 module.py:812] default: "GET /_ah/api/discovery/v1/apis/library2/v1.0/rest HTTP/1.1" 200 3277 
+0

Eine wirklich elegante Lösung, dieses Beispiel speziell backend.py machte deutlich, wie man api Klassen aus verschiedenen Dateien benutzt. – Ryan