2016-05-25 2 views
2

Je suis en train de revenir jsonp comme dans callbackname (data.strified)Retour JSONP via AWS Lambda/passerelle API

callback(null, 
    (!!event.cb && event.cb.length > 0) 
    ? event.cb.replace(/[^a-z0-9_]/i, '') + '(' + JSON.stringify(data) + ')' 
    : data 
); 

Ma façon rapide et sale retourne maintenant les données et si? Cb = test est donné il retourne:

"test({\"valid\":false,\"data\":false})" 

Y at-il moyen de se débarrasser des guillemets et des caractères d'échappement? L'API devrait fonctionner avec et sans ensemble de rappel.

+0

J'ai la même question ... Est-ce que vous avez une mise à jour? Merci @Tobias! –

+0

voir la réponse, je pense que c'est la façon la plus simple. – Tobias

+0

@IgnacioOcampo vous avez une solution pour cela? :) – Tobias

Répondre

3

Étant donné que vous avez ce type de fonction lambda:

exports.handler = function(event, context) { 
    var data={"test":"data"}; 
    context.done(null, 
      (!!event.cb && event.cb.length > 0) 
      ? event.cb.replace(/[^a-z0-9_]/i, '') + '(' + JSON.stringify(data) + ')' 
      : data 
    ); 
}; 

Lorsque vous donnez un événement comme

{ 
    "cb": "callback" 
} 

Il donnera cette sortie:

"callback({\"test\":\"data\"})" 

Jusqu'à présent , tellement bon. Maintenant, vous venez à la passerelle API et en partie Response Integration vous écrivez ce

$util.parseJson($input.json('$')) 

Que vous obtiendrez callback({"test":"data"}) en sortie lorsque vous invoquez l'API terminal Gateway.

+0

Cela a fonctionné très bien pour nous. Merci! –

1

Vous pouvez utiliser un modèle de mappage d'intégration pour ce faire. Quelque chose comme ça devrait vous aider à analyser le Json.

$util.parseJson($input.json('$')) 

Here sont plus de détails sur les modèles de mappage.

+0

comment pourrais-je configurer le modèle de mappage d'intégration? J'ai déjà fait ce qui précède, mais il ne produit plus rien ... est-ce que cela prendrait aussi en charge json et jsonp? comme dans les données pures vs données enveloppées dans le nom de la fonction – Tobias

1

Comme l'a fait Çağatay Gürtürk, vous faites une stringification de votre résultat et vous le retournez.

Cependant, si votre lambda accepte également callbacks non, vous pouvez vérifier dans le modèle VTL:

passerelle API et en partie réponse Intégration:

#if($input.params('callback') != "") 
$util.parseJson($input.json('$')) 
#else 
$input.json('$') 
#end