1

Ich habe eine POST-API-Gateway-Methode, an die ich die folgende Anwendung/JSON-Stelle senden, um Parameter von ihm zu einem Lambda, mit dem die Methode verbunden ist, zu senden:API-Gateway - Body Mapping-Vorlage - optionale Körperparameter

{ 
    "otherClientId": "12345", 
    "message": "Text", 
    "seconds": 0, 
    "hours": 0 
} 

ich die folgende Zuordnungsvorlage verwenden:

#set($inputRoot = $input.path('$')) 
{ 
    "authorizedUser": "$context.authorizer.principalId", 
    "otherClientId": "$inputRoot.otherClientId", 
    "message": "$inputRoot.message", 
    "amount": $inputRoot.amount, 
    "duration": $inputRoot.duration 
} 

Das Problem, das ich erlebt habe ist, dass ich eine „Bad String“ Fehlermeldung beim Versuch, die Anforderung ohne Betrag oder die Dauer zu senden. Aus irgendeinem Grund scheinen diese Parameter nicht optional zu sein (aber ich brauche sie!). Ich bin in der Lage, andere Parameter, wie zum Beispiel Nachricht, aber nicht die zwei Zahlenparameter zu verpassen.

Hat jemand anderes dies erfahren oder kann jemand auf das Offensichtliche hinweisen, das ich wahrscheinlich vermisse? Die AWS-Dokumentation ist ein wenig spärlich zu diesem Thema.

Antwort

1

Wahrscheinlich geschieht dies, weil ohne diese params vorbei, Ihre json Anfrage wie folgt aussieht:

#set($inputRoot = $input.path('$')) 
{ 
    "authorizedUser": "$context.authorizer.principalId", 
    "otherClientId": "$inputRoot.otherClientId", 
    "message": "$inputRoot.message", 
    "amount": , 
    "duration": 
} 

Die einfachste Art und Weise zu beheben, ist $inputRoot.amount und $inputRoot.duration mit Zitaten zu wickeln:

#set($inputRoot = $input.path('$')) 
{ 
    "authorizedUser": "$context.authorizer.principalId", 
    "otherClientId": "$inputRoot.otherClientId", 
    "message": "$inputRoot.message", 
    "amount": "$inputRoot.amount", 
    "duration": "$inputRoot.duration" 
} 

Alternativ Sie können die Anforderung mit der Bedingung if verknüpfen, z. B.

#set($hasLimit = $input.params('limit') != "") 
#set($hasOffset = $input.params('offset') != "") 
#set($hasPeriod = $input.params('period') != "") 
#set($hasType = $input.params('type') != "") 
{ 
    "environment": "$input.params('environment')" 
    #if($hasLimit),"limit": $input.params('limit')#end 
    #if($hasOffset),"offset": $input.params('offset')#end 
    #if($hasPeriod),"period": "$input.params('period')"#end 
    #if($hasType),"type": "$input.params('type')"#end 
} 
+0

Vielen Dank für Ihre Antwort! Ich habe viele Kombinationen ausprobiert: '#set ($ hasAuthorizedUser =" $ context.authorizer.principalId "! =" ") #set ($ hasMessage = $ input.path ('$. Message')! =" ") #set ($ hasAmount = $ input.path ('$. Betrag')! = "") #set ($ hasDuration = $ input.path ('$. Dauer')! = "") { #if ($ hasAuthorizedUser), "authorizedUser": "$ context.authorizer.principalId" #end #if ($ hasMessage), "Nachricht": $ input.path ('$. message') # end #if ($ hasAmount), "Betrag": $ input.path ('$ .betrag') # end #if ($ hasDuration), "duration": $ input.path ('$. duration') # end } 'aber bekomme eine schlechte Zeichenfolge auch mit allen Parametern – RossP

+0

Während ich weiß, dass die erste Lösung (mit den Anführungszeichen) funktioniert, erfordert es, dass ich die Zeichenfolgen zurück in nu konvertieren mbers innerhalb des Lambda, und das fühlt sich falsch für mich an! – RossP

+0

es scheint, dass Sie extra ',' vor authorizedUser versuchen: '{ #if ($ hasAuthorizedUser)" authorizedUser ":" $ context.authorizer.principalId "#end #if ($ hasMessage)," Nachricht ": $ input.path ('$. message') # end #if ($ hasAmount), "Betrag": $ input.path ('$ .betrag') # end #if ($ hasDuration), "duration": $ input.path ('$. duration') # end } ' –

0

Ich denke, Sie verweisen versehentlich auf die transformierten Feldnamen über $ inputRoot, wenn Sie die Eingabefeldnamen für 'Sekunden' und 'Stunden' referenzieren möchten. Nicht sicher, wie diese Zuordnung nach Betrag und Dauer aussehen soll, aber $ inputRoot.amount und $ inputRoot.duration sind in der von Ihnen bereitgestellten Eingabe nicht vorhanden.

#set($inputRoot = $input.path('$')) 
{ 
    "authorizedUser": "$context.authorizer.principalId", 
    "otherClientId": "$inputRoot.otherClientId", 
    "message": "$inputRoot.message", 
    "amount": $inputRoot.seconds, 
    "duration": $inputRoot.hours 
}