it-swarm.asia

Cara meneruskan parameter querystring atau rute ke AWS Lambda dari Amazon API Gateway

misalnya jika kita ingin menggunakan 

GET /user?name=bob

atau

GET /user/bob

Bagaimana Anda akan melewatkan kedua contoh ini sebagai parameter ke fungsi Lambda?

Saya melihat sesuatu tentang pengaturan "dipetakan dari" dalam dokumentasi, tetapi saya tidak dapat menemukan pengaturan itu di konsol API Gateway.

  • method.request.path.parameter-name untuk parameter path bernama parameter-name sebagaimana didefinisikan dalam halaman Permintaan Metode.
  • method.request.querystring.parameter-name untuk parameter string kueri bernama parameter-name sebagaimana didefinisikan dalam halaman Permintaan Metode.

Saya tidak melihat salah satu dari opsi ini meskipun saya mendefinisikan string kueri.

251
MonkeyBonkey

Mulai September 2017, Anda tidak lagi harus mengonfigurasi pemetaan untuk mengakses badan permintaan.

Yang perlu Anda lakukan adalah memeriksa, "Gunakan integrasi Proxy Lambda", di bawah Permintaan Integrasi, di bawah sumber daya.

 enter image description here

Anda kemudian dapat mengakses parameter kueri, parameter jalur, dan header seperti itu

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
175
Jonathan

Langkah-langkah untuk membuat ini berfungsi adalah:

Dalam Konsol API Gateway ...

  1. pergi ke Resources -> Integration Request
  2. klik pada ikon plus atau edit di sebelah templat dropdown (anehnya saya tahu karena bidang templat sudah terbuka dan tombol di sini terlihat berwarna abu-abu)
  3. Ketikkan application/json secara eksplisit di bidang tipe-konten meskipun itu menunjukkan default (jika Anda tidak melakukan ini tidak akan menyimpan dan tidak akan memberi Anda pesan kesalahan)
  4. letakkan ini di pemetaan input { "name": "$input.params('name')" }

  5. klik pada kotak centang di sebelah dropdown templates (Saya berasumsi inilah yang akhirnya menyelamatkannya)

193
MonkeyBonkey

Saya telah menggunakan templat pemetaan ini untuk memberikan Parameter String Kueri, Tajuk, Metode, Jalur, dan URL ke acara Lambda. Saya menulis posting blog yang menjelaskan templat lebih detail: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from- api-gateway/

Di sini adalah Templat Pemetaan yang dapat Anda gunakan:

{
  "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
  }  
}
118
kennbrodhagen

Saat ini templat tarik-turun disertakan dalam Konsol Gateway API di AWS.

Untuk API Anda, klik pada nama sumber daya ... lalu DAPATKAN

Luaskan "Templat Pemetaan Tubuh"

Ketikkan 

aplikasi/json

untuk Jenis-Konten (harus diketik secara eksplisit) dan klik tanda centang

Jendela baru akan terbuka dengan kata-kata "Hasilkan template" dan dropdown (lihat gambar).

Memilih 

Permintaan Metode passthrough

 enter image description here

Kemudian klik simpan

Untuk mengakses variabel apa pun, cukup gunakan sintaks berikut (ini adalah Python) Mis. URL:

https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

Anda bisa mendapatkan variabel sebagai berikut:

from __future__ import print_function

import boto3
import json

print('Loading function')


def lambda_handler(event, context):
    print(event['params']['querystring']['token'])
    print(event['params']['querystring']['uid'])

Jadi tidak perlu menyebutkan atau memetakan secara eksplisit setiap variabel yang Anda inginkan.

32

Jawaban yang diterima bekerja dengan baik untuk saya, tetapi memperluas pada jawaban gimenete, saya ingin template umum yang bisa saya gunakan untuk melewati semua params kueri/path/header (seperti string untuk saat ini), dan saya datang template berikut. Saya mempostingnya di sini kalau-kalau ada yang merasa berguna:

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}
24
BenV

Untuk meneruskan parameter ke fungsi lambda Anda, Anda perlu membuat pemetaan antara permintaan API Gateway dan fungsi lambda Anda. Pemetaan ini dilakukan di bagian Integration Request -> Mapping templates dari sumber daya Gateway API yang dipilih.

Buat pemetaan tipe application/json, lalu di sebelah kanan Anda akan mengedit (klik pensil) templat.

Template pemetaan sebenarnya adalah template Velocity di mana Anda dapat menggunakan ifs, loop, dan tentu saja mencetak variabel di atasnya. Template memiliki variabel-variabel ini disuntikkan di mana Anda dapat mengakses parameter querystring, header permintaan, dll. Secara individual. Dengan kode berikut, Anda dapat membuat ulang seluruh querystring:

{
    "querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
    "body" : $input.json('$')
}

Catatan: klik pada simbol centang untuk menyimpan templat. Anda dapat menguji perubahan Anda dengan tombol "test" di sumber Anda. Tetapi untuk menguji parameter querystring di konsol AWS, Anda perlu menentukan nama parameter di bagian Method Request sumber daya Anda.

Catatan: periksa Panduan Pengguna Velocity untuk informasi lebih lanjut tentang bahasa templating Velocity.

Kemudian dalam templat lambda Anda, Anda bisa melakukan yang berikut untuk mendapatkan querystring yang diuraikan:

var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo
19
gimenete

Sebagai bagian dari mencoba menjawab salah satu pertanyaan saya sendiri di sini , saya menemukan trik ini.

Di templat pemetaan Gateway API, gunakan yang berikut untuk memberi Anda string kueri lengkap seperti yang dikirim oleh klien HTTP:

{
    "querystring": "$input.params().querystring"
}

Keuntungannya adalah Anda tidak perlu membatasi diri pada serangkaian kunci yang dipetakan yang telah ditentukan sebelumnya dalam string kueri Anda. Sekarang Anda dapat menerima pasangan nilai kunci dalam string kueri, jika ini yang ingin Anda tangani. 

Catatan: Menurut this , hanya $input.params(x) yang terdaftar sebagai variabel yang tersedia untuk templat VTL. Ada kemungkinan bahwa internal mungkin berubah dan querystring mungkin tidak lagi tersedia.

15
user3526

Sekarang Anda harus dapat menggunakan tipe integrasi proxy baru untuk Lambda untuk secara otomatis mendapatkan permintaan penuh dalam bentuk standar, daripada mengkonfigurasi pemetaan.

lihat: http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration- di-proxy-sumber daya

11
Jack Kohn - AWS

DAPATKAN/pengguna? Nama = bob

{
    "name": "$input.params().querystring.get('name')"
}

DAPATKAN/pengguna/bob

{
    "name": "$input.params('name')"
}
4
Dmitry Grinko

Banyak jawaban di sini luar biasa. Tetapi saya menginginkan sesuatu yang sedikit lebih sederhana ... Saya menginginkan sesuatu yang akan bekerja dengan sampel "Hello World" secara gratis. Ini berarti saya ingin sederhana menghasilkan badan permintaan yang cocok dengan string kueri:

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

Saya pikir jawaban teratas menghasilkan sesuatu yang lebih berguna ketika membangun sesuatu yang nyata, tetapi untuk menjalankan halo dunia cepat menggunakan templat dari AWS ini bekerja dengan baik.

4
KrisTC

Contoh pemetaan parameter berikut melewati semua parameter, termasuk path, querystring dan header, hingga ke titik akhir integrasi melalui payload JSON

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

Akibatnya, templat pemetaan ini menampilkan semua parameter permintaan dalam muatan sebagaimana diuraikan sebagai berikut:

{
  "parameters" : {
     "path" : {    
       "path_name" : "path_value", 
       ...
     }
     "header" : {  
       "header_name" : "header_value",
       ...
     }
     'querystring" : {
       "querystring_name" : "querystring_value",
       ...
     }
   }
}

Disalin dari Panduan Pengembang Amazon API Gateway

4
matsev

String kueri lurus ke depan untuk mem-parsing dalam javascript di lambda 

untuk GET/pengguna? name = bob

 var name = event.params.querystring.name;

Ini tidak memecahkan pertanyaan GET pengguna/bob.

2
Michael Riecken

Fungsi Lambda mengharapkan input JSON, oleh karena itu parsing string kueri diperlukan. Solusinya adalah mengubah string kueri ke JSON menggunakan Template Pemetaan.
Saya menggunakannya untuk C # .NET Core, jadi input yang diharapkan haruslah JSON dengan parameter "queryStringParameters". 
Ikuti 4 langkah di bawah ini untuk mencapai itu:

  1. Buka templat pemetaan sumber daya API Gateway Anda dan tambahkan application/json konten-tyap baru:

 API Gateway mapping template

  1. Salin templat di bawah ini, yang mem-parsing string kueri ke dalam JSON, dan rekatkan ke templat pemetaan:

    {
    "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
    }
    
  2. Di API Gateway, panggil fungsi Lambda Anda dan tambahkan string kueri berikut (misalnya): param1=111&param2=222&param3=333

  3. Template pemetaan harus membuat output JSON di bawah ini, yang merupakan memasukkan untuk fungsi Lambda Anda. 

    {
    "queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
    }
    
  4. Kamu sudah selesai. Dari titik ini, logika fungsi Lambda Anda dapat menggunakan parameter string kueri.
    Semoga berhasil!

1
Lior Kirshner

Sebagai jawaban Jonathan, setelah tanda Gunakan integrasi Proxy Lambda di Permintaan Integrasi, dalam kode sumber Anda, Anda harus menerapkan format di bawah ini sebagai kesalahan 502 Gerbang Buruk.

NodeJS 8.10:

exports.handler = async (event, context, callback) => {
  // TODO: You could get path, parameter, headers, body value from this
  const { path, queryStringParameters, headers, body } = event;

  const response = {
    "statusCode": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "body": JSON.stringify({
      path, 
      query: queryStringParameters,
      headers,
      body: JSON.parse(body)
    }),
    "isBase64Encoded": false
  };

  return response;
};

Jangan lupa sebarkan resource Anda di API Gateway sebelum menjalankan kembali API Anda . Respons JSON hanya mengembalikan yang ditetapkan di body sudah benar . Jadi, Anda bisa mendapatkan path, parameter , tajuk, nilai tubuh dari acara

const {path, queryStringParameters, header, body} = acara;

0
Long Nguyen

Anda dapat menggunakan Lambda sebagai "Lambda Proxy Integration", ref ini [ https://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple- proxy-for-lambda.html # api-gateway-proxy-integrasi-lambda-function-python] , opsi yang tersedia untuk lambda ini adalah 

Untuk Nodejs Lambda 'Event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables', Dan 'event.requestContext'

Untuk Python Lambda Event ['header'] ['parametername'] dan sebagainya

0
RajDev