2016-04-07 11 views
13

Ich benutze API Gateway in Amazon als einfacher Proxy für eine Backend-API. Die Hauptgründe für die Verwendung sind: eine einfache Möglichkeit, API-Schlüssel zu erhalten und "Umgebungen" zu authentifizieren, zu verfolgen und zu handhaben.AWS API Gateway: Passiere alle Parameter

Mein Problem ist, dass wir nur alle Abfrageparameter, Header usw. zu unserem Backend übergeben und es damit umgehen lassen wollen. Auf dem Rückweg möchten wir dem Kunden den entsprechenden Antwortcode von unserem Service zurückgeben. müssen sie nicht explizit zuordnen. Wie ich es verstehe, müssen Sie ziemlich genau jeden Abfrageparameter angeben, und wenn sich die Parameter ändern oder Sie mehr hinzufügen, müssen Sie Ihre API aktualisieren. Das ist für uns während des Entwicklungstests etwas mühsam.

Gibt es eine Möglichkeit, dem Gateway mitzuteilen, dass es nur Query-Parameter, Header usw. akzeptiert und weiterleitet, sodass Sie sie nicht explizit angeben müssen? Gleiche Frage für die Antwort Statuscodes?

Antwort

10

Leider gibt es keine Möglichkeit, eine Passthrough aller Parameter durchzuführen, Sie müssen jeden in der Methodenanforderung angeben. Gleiche Antwort für Statuscodes.

Wir haben die ‚Proxy‘ Integration für HTTP-Endpunkte und Lambda-Funktionen seit gestartet, der als Proxy für die Anforderungseingabe handeln und alle Parameter und die Nutzlast auf die Integration schicken. Für Lambda-Funktionen gibt es eine vorgefertigte JSON-Struktur, die alle Parameter und Nutzdaten sowie Anforderungskontexte und Stufenvariablen enthält.

Sehen Sie diese doc: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource

Dies ist ein Feature-Request wir in der Vergangenheit gehabt haben und es ist auf unseren Rückstand, aber nicht zu diesem Zeitpunkt ETA. Ich nehme das als ein weiteres +1 für beide Passthrough-Funktionen.

+0

Perfekt, danke! – alph486

+0

@ jack-kohn-aws Ich muss einen Filterabfrageparameter durchlaufen. z.B. https://api.xxx/pets?filters[search]=cute Wie würde ich das erreichen? – rabishah

+0

+1. Dies wäre eine große Hilfe für Leute, die versuchen, Legacy-APIs voller Ad-hoc-Endpunkte mit wenig Dokumentation von Abfrageparametern zu migrieren. – Eric

5

Für die Anforderung gibt es Zuordnungen leicht durch alles passieren, das ist eine Vor kurzem habe ich verwendet habe:

{ 
    "method": "$context.httpMethod", 
    "body" : $input.json('$'), 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "queryParams": { 
    #foreach($param in $input.params().querystring.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "pathParams": { 
    #foreach($param in $input.params().path.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "stage-variables" : { 
    #foreach($key in $stageVariables.keySet()) 
     "$key" : "$util.escapeJavaScript($stageVariables.get($key))" 
     #if($foreach.hasNext),#end 
    #end 
    }, 
    "context" : { 
    "account-id" : "$context.identity.accountId", 
    "api-id" : "$context.apiId", 
    "api-key" : "$context.identity.apiKey", 
    "authorizer-principal-id" : "$context.authorizer.principalId", 
    "caller" : "$context.identity.caller", 
    "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider", 
    "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType", 
    "cognito-identity-id" : "$context.identity.cognitoIdentityId", 
    "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId", 
    "http-method" : "$context.httpMethod", 
    "stage" : "$context.stage", 
    "source-ip" : "$context.identity.sourceIp", 
    "user" : "$context.identity.user", 
    "user-agent" : "$context.identity.userAgent", 
    "user-arn" : "$context.identity.userArn", 
    "request-id" : "$context.requestId", 
    "resource-id" : "$context.resourceId", 
    "resource-path" : "$context.resourcePath" 
    } 
} 

Es durchläuft alle Header und Parameter alles abzubilden. Es gibt auch ein neues Feature, das announced yesterday ist, das Ihnen ermöglicht, den unformatierten Anforderungshauptteil zu übergeben.

Ich denke, Sie könnten einen ähnlichen Ansatz zum Erstellen eines universellen Response-Mapping verwenden. Vielleicht möchten Sie sich die Zuordnungsfunktion parseJson() ansehen, die auch announced yesterday war. Ich glaube, dass die neue parseJson() Funktion Ihnen erlauben würde, eine Zeichenkette zurückzugeben, die JSON-Daten von Ihrem Backend enthält und diese leicht zu einer JSON-Antwort im API-Zugang zugeordnet werden kann.

+0

Wo dies geht? Ist das etwas in einem Lambda oder anderswo? Es ist nicht stolz auf das Aussehen. Können Sie Ihrer Antwort noch mehr Kontext hinzufügen? – EdgeCaseBerg

+1

@EdgeCaseBerg Dies ist eine Anforderungszuordnungsvorlage für AWS API Gateway. Dokumentiert hier: http://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings.html –

1

Ich glaube, Sie http-Proxy-Funktion von API-Gateway verwenden können -, die alle Parameter, die die Art und Weise nehmen Sie an ihn schicken - zu Ihrem genannten EC2 URL oder einer anderen URL