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.
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.
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']
Langkah-langkah untuk membuat ini berfungsi adalah:
Dalam Konsol API Gateway ...
Resources -> Integration Request
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)letakkan ini di pemetaan input { "name": "$input.params('name')" }
klik pada kotak centang di sebelah dropdown templates (Saya berasumsi inilah yang akhirnya menyelamatkannya)
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
}
}
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
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.
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
}
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
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.
Sekarang Anda harus dapat menggunakan tipe integrasi proxy baru untuk Lambda untuk secara otomatis mendapatkan permintaan penuh dalam bentuk standar, daripada mengkonfigurasi pemetaan.
DAPATKAN/pengguna? Nama = bob
{
"name": "$input.params().querystring.get('name')"
}
DAPATKAN/pengguna/bob
{
"name": "$input.params('name')"
}
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.
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
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.
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:
application/json
konten-tyap baru: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}
}
Di API Gateway, panggil fungsi Lambda Anda dan tambahkan string kueri berikut (misalnya): param1=111¶m2=222¶m3=333
Template pemetaan harus membuat output JSON di bawah ini, yang merupakan memasukkan untuk fungsi Lambda Anda.
{
"queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
}
Kamu sudah selesai. Dari titik ini, logika fungsi Lambda Anda dapat menggunakan parameter string kueri.
Semoga berhasil!
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;
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