it-swarm.asia

Cara lulus dari sebuah params POST ke AWS Lambda dari Amazon API Gateway

Dalam pertanyaan ini Bagaimana cara mengirimkan parameter kueri atau rute ke AWS Lambda dari Amazon API Gateway

memperlihatkan cara memetakan string string kueri ke AWS lambda menggunakan API gateway. Saya ingin melakukan hal yang sama tetapi memetakan nilai POST alih-alih string-kueri. Saya mencoba:

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

tetapi tidak berhasil, saya tidak melihat data formulir yang sebenarnya. BTW saya memposting menggunakan: 

application/x-www-form-urlencoded

Saya mendapatkan respons dari fungsi lambda saya, jadi saya tahu itu memanggil lambda baik-baik saja, tetapi masalah saya adalah bahwa saya tidak melihat params POST di mana pun. Saya tidak tahu bagaimana memetakannya. Saya membuang semua yang saya dapatkan di sisi Lambda dan ini dia:

 {"values":"{path={}, querystring={}, header={Accept=*/*, Accept-Encoding=gzip, deflate, Accept-Language=en-US,en;q=0.8, Cache-Control=no-cache, CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, CloudFront-Viewer-Country=US, Content-Type=application/x-www-form-urlencoded, Origin=chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop, Postman-Token=7ba28698-8753-fcb1-1f48-66750ce12ade, Via=1.1 6ba5553fa41dafcdc0e74d152f3a7a75.cloudfront.net (CloudFront), X-Amz-Cf-Id=sc8C7dLcW0BHYopztNYrnddC0hXyFdBzHv0O9aWU1gKhd1D_J2HF3w==, X-Forwarded-For=50.196.93.57, 54.239.140.62, X-Forwarded-Port=443, X-Forwarded-Proto=https}}"}
34
ecorvo

Jawaban bagus oleh r7kamura. Selain itu, berikut adalah contoh templat pemetaan yang dapat dipahami dan kuat untuk application/x-www-form-urlencoded yang berfungsi untuk semua kasus (dengan asumsi POST):

{
    "data": {
        #foreach( $token in $input.path('$').split('&') )
            #set( $keyVal = $token.split('=') )
            #set( $keyValSize = $keyVal.size() )
            #if( $keyValSize >= 1 )
                #set( $key = $util.urlDecode($keyVal[0]) )
                #if( $keyValSize >= 2 )
                    #set( $val = $util.urlDecode($keyVal[1]) )
                #else
                    #set( $val = '' )
                #end
                "$key": "$val"#if($foreach.hasNext),#end
            #end
        #end
    }
}

Itu akan mengubah input

name=Marcus&email=email%40example.com&message=

ke

{
    "data": {
                "name": "Marcus",
                "email": "[email protected]",
                "message": ""
    }
}

Handler Lambda dapat menggunakannya seperti ini (ini mengembalikan semua data input):

module.exports.handler = function(event, context, cb) {
  return cb(null, {
    data: event.data
  });
};
54
Marcus Whybrow

Anda dapat mengonversi data badan permintaan apa pun menjadi format JSON yang valid dengan mengonfigurasi templat pemetaan dalam pengaturan integrasi sehingga AWS Lambda dapat menerimanya.

Saat ini sepertinya Amazon API Gateway belum mendukung aplikasi/x-www-form-urlencoded secara resmi, tetapi avilewin memposting solusi untuk melakukannya di forum AWS. Dalam templat pemetaan, Anda dapat menggunakan Velocity Template Language (VTL) , jadi yang perlu Anda lakukan adalah mengonfigurasi templat pemetaan yang mengubah format aplikasi/x-www-form-urlencoded menjadi format JSON yang valid. Tentu saja ini adalah solusi kotor, tetapi saya pikir itu satu-satunya cara untuk melakukannya untuk saat ini.

20
r7kamura

Jika Anda mengaktifkan Lambda Proxy Integration  enter image description here

Badan POST akan tersedia dari:

event['body']['param']

Parameter dan header GET juga akan tersedia melalui

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

Anda dapat mengonversi params menjadi JSON dengan templat gateway API: https://forums.aws.Amazon.com/thread.jspa?messageID=673012&tstart=0#673012

Atau Anda dapat melakukan ini dalam fungsi lambda sendiri menggunakan parser parser QueryString: https://www.npmjs.com/package/qs

var qs = require('qs');
var obj = qs.parse('a=c');  // { a: 'c' } 

Jika Amazon menambahkan dukungan bawaan untuk fitur tersebut, saya akan menggunakannya tetapi sampai saat itu saya pribadi lebih suka cara kedua karena lebih bersih dan lebih mudah untuk di-debug jika terjadi kesalahan.

Perbarui Juli 2017:

Anda dapat menggunakan integrasi proxy yang mendukungnya secara default: http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for- lambda.html

11
advncd

Memperluas jawaban @ markus-whybrow:

{
        #foreach( $token in $input.path('$').split('&') )
            #set( $keyVal = $token.split('=') )
            #set( $keyValSize = $keyVal.size() )
            #if( $keyValSize >= 1 )
                #set( $key = $util.urlDecode($keyVal[0]) )
                #if( $keyValSize >= 2 )
                    #set( $val = $util.urlDecode($keyVal[1]) )
                #else
                    #set( $val = '' )
                #end
                "$key": "$util.escapeJavaScript($val)"#if($foreach.hasNext),#end
            #end
        #end
    }

Ini menghilangkan "data" dan juga memperbaiki kasus jika Anda memiliki penawaran ganda di salah satu nilai Anda.

3
Mark Sergienko

Saya menerapkan API dengan POST permintaan dengan Content-Type adalah application/x-www-form-urlencoded. Jika Anda hanya tertarik untuk mendapatkan querystring nilai yang mirip dengan permintaan GET, gunakan sintaks pemetaan ini.

{
    "body": "$input.body"
}

Catatan, Anda dapat menambahkan pemetaan lain juga ... Saya meninggalkan itu untuk mengatasi masalah aslinya.

Ini tutorial blog yang saya gunakan ketika awalnya mengimplementasikan API saya. Fungsi lambda saya kemudian mem-parsing querystring meneruskan data ke proses lain. 

2
openwonk

Saya menemukan solusi yang sangat sederhana. Saya pikir ini layak untuk dibagikan, karena butuh beberapa waktu untuk menemukan kode kerja minimal ini.

Jika Anda memiliki formulir umum, yang mengirim data dengan aplikasi jenis konten/x-www-form-urlencoded, cukup tandai "Integrasi proxy Lambda", maka Anda akan menemukan data formulir yang disandikan di acara. modul asli querystring.

const querystring = require('querystring')

function handler (event, context, callback) {
  // Read form data.
  const { user, pass } = querystring.parse(event.body)

  // Follows your code to handle request.
}
1
Gianluca Casati

Fungsi sederhana yang mengembalikan kamus yang diurutkan dari nilai yang dipasang:

import urllib
from collections import OrderedDict
postdata = ''

def GetPostData(body):
    #postdata = OrderedDict()
    postdata = {}
    for items in body.split('&'):
        vals = items.split('=')
        postdata[vals[0]] = urllib.parse.unquote(vals[1])
    return postdata

#Testing it out:
#Assume you get body from event['body'] or body = event.get['body']
body = 'text=This%20works%20really%20well%21%245123%21%403%2146t5%40%2341&anotherkey=isawesome23412%201%21%403%21%40312'

postdata = GetPostData(body)
print(postdata['text'])
#returns 'This works really [email protected][email protected]#41'
print(postdata['anotherkey'])
#returns 'isawesome23412 [email protected][email protected]'

Untuk menghindari kesalahan kunci ketika item yang diposting hilang, Anda harus menggunakan value = postdata.get ('') sebagai gantinya, karena nilai akan menjadi Tidak ada jika kunci tidak ada.

0
Arvin Amir

Ini berfungsi dengan integrasi lambda ..__ Dengan anggapan badan permintaan POST Anda mis. 

{
   "name" : "Hello",
   "address" : "Cool place" 
}

Anda dapat mengaksesnya seperti ini: 

if (event.body !== null && event.body !== undefined) {
   let body = JSON.parse(event.body)
   let name = body.name;
   let address = body.address;
}

Info lebih lanjut di sini: http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

0
Dodi