एपीआई गेटवे के माध्यम से लैंबडा में जूस बॉडी प्राप्त करना


85

मैं वर्तमान में AWS Api गेटवे के माध्यम से AWS लंबोदर पर एक बॉट बनाने के लिए NodeJS का उपयोग कर रहा हूं और मैं POST अनुरोधों और JSON डेटा के साथ एक समस्या में चल रहा हूं। मेरी एपीआई 'लैम्बडा प्रॉक्सी इंटीग्रेशन का उपयोग करें' का उपयोग करती है और यहां तक ​​कि जब मैं किसी सामग्री-प्रकार के एप्लिकेशन / जोंस और शरीर में कुछ जोंस भेजने वाली प्रॉक्सी का परीक्षण करता {"foo":"bar"}हूं, जैसे मैं पहले इसे पार्स किए बिना ऑब्जेक्ट तक नहीं पहुंच सकता

जैसे

  var json = JSON.parse(event.body);
  console.log(json.foo);

अब मुझे पता है कि यह सिर्फ JSON.parse के माध्यम से इसे चलाने के लिए एक बड़ी बात नहीं लगती है, लेकिन मैंने कई अन्य उदाहरण देखे हैं जहां ऐसा बिल्कुल नहीं है। यहां देखें https://github.com/pinzler/fb-messenger-bot-aws-lambda/blob/master/index.js

क्या मुझे इसे सही ढंग से संभालने के लिए अपने एपीआई गेटवे में कुछ भी जोड़ने की आवश्यकता है? 'पोस्ट मेथड रिक्वेस्ट' सेक्शन में मेरे 'रिक्वेस्ट बॉडी' स्टेप में रिक्वेस्ट बॉडी के लिए कंटेंट-टाइप ऑफ एप्लिकेशन / जसन सेट-अप है।

ऊपर दिए गए उदाहरण के लिए रीडमी प्रॉक्सी एकीकरण का उपयोग नहीं करता है जहाँ तक मैं बता सकता हूँ तो मुझे यकीन नहीं है कि मुझे यहाँ क्या करना चाहिए

जवाबों:


73

दो अलग-अलग लैम्ब्डा इंटीग्रेशन हैं जिन्हें आप एपीआई गेटवे में कॉन्फ़िगर कर सकते हैं, जैसे लैम्ब्डा इंटीग्रेशन और लैम्ब्डा प्रॉक्सी इंटीग्रेशन। के लिए लैम्ब्डा एकीकरण , आप अनुकूलित कर सकते हैं कि आप क्या पेलोड में लैम्ब्डा को पारित करने के लिए है कि आप शरीर पार्स करने के लिए की जरूरत नहीं है जा रहे हैं, लेकिन आप उपयोग कर रहे हैं जब लैम्ब्डा प्रॉक्सी एकीकरण एपीआई गेटवे में, एपीआई गेटवे होगा पेलोड में लैम्ब्डा करने के लिए प्रॉक्सी सब कुछ इस तरह,

{
    "message": "Hello me!",
    "input": {
        "path": "/test/hello",
        "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
            "Accept-Language": "en-US,en;q=0.8",
            "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",
            "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
            "Upgrade-Insecure-Requests": "1",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
            "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
            "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
            "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
            "X-Forwarded-Port": "443",
            "X-Forwarded-Proto": "https"
        },
        "pathParameters": {"proxy": "hello"},
        "requestContext": {
            "accountId": "123456789012",
            "resourceId": "us4z18",
            "stage": "test",
            "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
            "identity": {
                "cognitoIdentityPoolId": "",
                "accountId": "",
                "cognitoIdentityId": "",
                "caller": "",
                "apiKey": "",
                "sourceIp": "192.168.100.1",
                "cognitoAuthenticationType": "",
                "cognitoAuthenticationProvider": "",
                "userArn": "",
                "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
                "user": ""
            },
            "resourcePath": "/{proxy+}",
            "httpMethod": "GET",
            "apiId": "wt6mne2s9k"
        },
        "resource": "/{proxy+}",
        "httpMethod": "GET",
        "queryStringParameters": {"name": "me"},
        "stageVariables": {"stageVarName": "stageVarValue"},
        "body": "{\"foo\":\"bar\"}",
        "isBase64Encoded": false
    }
}

उदाहरण के लिए आप संदर्भित कर रहे हैं, यह मूल अनुरोध से शरीर को नहीं मिल रहा है। यह API गेटवे पर प्रतिक्रिया निकाय का निर्माण कर रहा है। यह इस प्रारूप में होना चाहिए,

{
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "...",
    "isBase64Encoded": false
}

25
और उसके बाद JSON.parse (event.body) (लैंबडा प्रॉक्सी एकीकरण)
timhc22

4
@ timhc22 यह मुख्य बिंदु है, एक एकल पंक्ति को स्वीकृत उत्तर होना चाहिए
5413668060

53

मुझे लगता है कि लैम्बडा के साथ एपीआई गेटवे एकीकरण के साथ काम करते समय कुछ चीजों को समझना होगा।

लैंबडा इंटीग्रेशन बनाम लाम्बडा प्रॉक्सी इंटीग्रेशन

वहाँ केवल लैम्ब्डा इंटीग्रेशन हुआ करता था जिसमें मैपिंग टेम्प्लेट की आवश्यकता होती है। मुझे लगता है यही कारण है कि अभी भी इसका उपयोग करते हुए कई उदाहरण देख रहे हैं।

  • अमेज़ॅन एपीआई गेटवे से AWS लैम्बडा के लिए एक क्वेरिस्ट्रिंग या रूट पैरामीटर कैसे पास करें

    सितंबर 2017 तक, आपको अनुरोध निकाय तक पहुंचने के लिए मैपिंग को कॉन्फ़िगर करने की आवश्यकता नहीं है।

  • सर्वर रहित आर्किटेक्चर AWS पर

    लैम्ब्डा प्रॉक्सी इंटीग्रेशन, यदि आप इसे सक्षम करते हैं, तो एपीआई गेटवे JSON के लिए हर अनुरोध को मैप करेगा और इसे इवेंट ऑब्जेक्ट के रूप में लैम्बडा को पास करेगा। लैंबडा फंक्शन में आप क्वेरी स्ट्रिंग पैरामीटर, हेडर, स्टेज वैरिएबल, पाथ पैरामीटर्स, रिक्वेस्ट कॉन्टेक्स्ट, और इसके साथ बॉडी प्राप्त कर सकेंगे।

    लैम्ब्डा प्रॉक्सी इंटीग्रेशन को सक्षम किए बिना, आपको एपीआई गेटवे के इंटीग्रेशन रिक्वेस्ट सेक्शन में मैपिंग टेम्प्लेट बनाना होगा और तय करना होगा कि HTTP रिक्वेस्ट को JSON में कैसे मैप किया जाए। और अगर आपको ग्राहक को जानकारी वापस देनी थी तो आपको एक एकीकरण प्रतिक्रिया मानचित्रण बनाने की संभावना होगी।

    लैम्ब्डा प्रॉक्सी इंटीग्रेशन को जोड़ने से पहले, उपयोगकर्ताओं को मैन्युअल रूप से अनुरोधों और प्रतिक्रियाओं को मैप करने के लिए मजबूर किया गया था, जो विशेष रूप से अधिक जटिल मैपिंग के साथ, कसना का एक स्रोत था

शरीर बच गया है स्ट्रिंग, JSON नहीं

लैम्ब्डा प्रॉक्सी इंटीग्रेशन का उपयोग करते हुए, लैम्ब्डा की स्थिति में शरीर एक स्ट्रिंग है जो बैकस्लैश से बच जाती है, न कि JSON से।

"body": "{\"foo\":\"bar\"}" 

यदि एक JSON फॉर्मैटर में परीक्षण किया गया है।

Parse error on line 1:
{\"foo\":\"bar\"}
-^
Expecting 'STRING', '}', got 'undefined'

नीचे दिया गया दस्तावेज़ प्रतिक्रिया के बारे में है, लेकिन यह अनुरोध पर लागू होना चाहिए।

जावास्क्रिप्ट के रूप में इसे JSON ऑब्जेक्ट के रूप में एक्सेस करने के लिए, इसे JSON ऑब्जेक्ट में JSON.parse के साथ JSON ऑब्जेक्ट में बदलने की आवश्यकता है, Python में json.dumps।

एडब्ल्यूएस प्रलेखन शो क्या करना है।

if (event.body !== null && event.body !== undefined) {
    let body = JSON.parse(event.body)
    if (body.time) 
        time = body.time;
}
...
var response = {
    statusCode: responseCode,
    headers: {
        "x-custom-header" : "my custom header value"
    },
    body: JSON.stringify(responseBody)
};
console.log("response: " + JSON.stringify(response))
callback(null, response);

यह इंगित करने के लिए धन्यवाद कि शरीर सिर्फ स्ट्रिंग नहीं बचा है JSON।
nngeek 14

1

मैं ज़प्पा के साथ लंबोदर का उपयोग कर रहा हूं; मैं json प्रारूप में POST के साथ डेटा भेज रहा हूं:

Basic_lambda_pure.py के लिए मेरा कोड है:

import time
import requests
import json
def my_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    print("Log stream name:", context.log_stream_name)
    print("Log group name:",  context.log_group_name)
    print("Request ID:", context.aws_request_id)
    print("Mem. limits(MB):", context.memory_limit_in_mb)
    # Code will execute quickly, so we add a 1 second intentional delay so you can see that in time remaining value.
    print("Time remaining (MS):", context.get_remaining_time_in_millis())

    if event["httpMethod"] == "GET":
        hub_mode = event["queryStringParameters"]["hub.mode"]
        hub_challenge = event["queryStringParameters"]["hub.challenge"]
        hub_verify_token = event["queryStringParameters"]["hub.verify_token"]
        return {'statusCode': '200', 'body': hub_challenge, 'headers': 'Content-Type': 'application/json'}}

    if event["httpMethod"] == "post":
        token = "xxxx"
    params = {
        "access_token": token
    }
    headers = {
        "Content-Type": "application/json"
    }
        _data = {"recipient": {"id": 1459299024159359}}
        _data.update({"message": {"text": "text"}})
        data = json.dumps(_data)
        r = requests.post("https://graph.facebook.com/v2.9/me/messages",params=params, headers=headers, data=data, timeout=2)
        return {'statusCode': '200', 'body': "ok", 'headers': {'Content-Type': 'application/json'}}

मुझे अगला जसन प्रतिक्रिया मिली:

{
"resource": "/",
"path": "/",
"httpMethod": "POST",
"headers": {
"Accept": "*/*",
"Accept-Encoding": "deflate, gzip",
"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/json",
"Host": "ox53v9d8ug.execute-api.us-east-1.amazonaws.com",
"Via": "1.1 f1836a6a7245cc3f6e190d259a0d9273.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "LVcBZU-YqklHty7Ii3NRFOqVXJJEr7xXQdxAtFP46tMewFpJsQlD2Q==",
"X-Amzn-Trace-Id": "Root=1-59ec25c6-1018575e4483a16666d6f5c5",
"X-Forwarded-For": "69.171.225.87, 52.46.17.84",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https",
"X-Hub-Signature": "sha1=10504e2878e56ea6776dfbeae807de263772e9f2"
},
"queryStringParameters": null,
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"path": "/dev",
"accountId": "001513791584",
"resourceId": "i6d2tyihx7",
"stage": "dev",
"requestId": "d58c5804-b6e5-11e7-8761-a9efcf8a8121",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": "",
"sourceIp": "69.171.225.87",
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": null,
"user": null
},
"resourcePath": "/",
"httpMethod": "POST",
"apiId": "ox53v9d8ug"
},
"body": "eyJvYmplY3QiOiJwYWdlIiwiZW50cnkiOlt7ImlkIjoiMTA3OTk2NDk2NTUxMDM1IiwidGltZSI6MTUwODY0ODM5MDE5NCwibWVzc2FnaW5nIjpbeyJzZW5kZXIiOnsiaWQiOiIxNDAzMDY4MDI5ODExODY1In0sInJlY2lwaWVudCI6eyJpZCI6IjEwNzk5NjQ5NjU1MTAzNSJ9LCJ0aW1lc3RhbXAiOjE1MDg2NDgzODk1NTUsIm1lc3NhZ2UiOnsibWlkIjoibWlkLiRjQUFBNHo5RmFDckJsYzdqVHMxZlFuT1daNXFaQyIsInNlcSI6MTY0MDAsInRleHQiOiJob2xhIn19XX1dfQ==",
"isBase64Encoded": true
}

मेरा डेटा बॉडी की पर था , लेकिन कोड 64 एनकोडेड है, मैं यह कैसे जान सकता हूं? मैंने देखा कि कुंजी Base64Encoded है

मैं शरीर की कुंजी के लिए मूल्य की प्रतिलिपि बनाता हूं और इस उपकरण और "यूरेका" के साथ डिकोड करता हूं, मुझे मूल्य मिलते हैं।

उम्मीद है इससे आपको मदद होगी। :)


0

आप Content-Typeहेडर को परिभाषित करना भूल गए होंगे । उदाहरण के लिए:

  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ items }),
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.