এপিআই গেটওয়ে দিয়ে লাম্বডায় জসন বডি পাচ্ছেন


86

আমি বর্তমানে এডাব্লুএস এপি গেটওয়ের মাধ্যমে এডাব্লুএস ল্যাম্বডায় একটি বট তৈরি করতে নোডজেএস ব্যবহার করছি এবং আমি পোস্ট অনুরোধ এবং জেএসওন ডেটা নিয়ে একটি সমস্যা নিয়ে চলেছি। আমার এপি 'ল্যাম্বডা প্রক্সি ইন্টিগ্রেশন ব্যবহার করুন' ব্যবহার করে এবং আমি যখন প্রক্সির প্রবন্ধটি কোনও সামগ্রী-ধরণের অ্যাপ্লিকেশন / জসন এবং কিছু জসন দেহে প্রেরণ করে পরীক্ষা করি তখনও আমি {"foo":"bar"}প্রথমে বস্তুটিকে বিশ্লেষণ না করে অ্যাক্সেস করতে পারি না

যেমন

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

এখন আমি জানি এটি কেবল JSON.parse এর মাধ্যমে চালানো কোনও বড় বিষয় বলে মনে হচ্ছে না, তবে আমি বেশ কয়েকটি অন্যান্য উদাহরণ দেখেছি যেখানে এটি মোটেই ঘটেনি। এখানে দেখুন https://github.com/pinzler/fb-mes यात्रा-bot-aws-lambda/blob/master/index.js

এটিকে সঠিকভাবে পরিচালনা করতে কি আমার এপিআই গেটওয়েতে কিছু যুক্ত করার দরকার আছে? আমার 'অনুরোধ বডি' 'পোস্ট পদ্ধতি অনুরোধ' বিভাগের পদক্ষেপে অনুরোধ বডিটির জন্য একটি সামগ্রী-ধরণের অ্যাপ্লিকেশন / জেসন সেটআপ রয়েছে।

উপরের উদাহরণের রিডমে প্রক্সি ইন্টিগ্রেশন ব্যবহার করা হবে বলে মনে হচ্ছে না যতদূর আমি বলতে পারি তাই আমি কী করব তা আমি নিশ্চিত নই

উত্তর:


74

ল্যাম্বদা ইন্টিগ্রেশন এবং ল্যাম্বদা প্রক্সি সংহতকরণের মতো এপিআই গেটওয়েতে কনফিগার করতে পারেন এমন দুটি পৃথক লাম্বদা সংহতকরণ রয়েছে। জন্য ল্যামডা ইন্টিগ্রেশন , আপনি কাস্টমাইজ করতে পারেন কি পে লোড মধ্যে ল্যামডা পাস হবে যে আপনি শরীর বিশ্লেষণ করতে প্রয়োজন হবে না যাচ্ছে, কিন্তু আপনি ব্যবহার করছেন যখন ল্যামডা প্রক্সি ইন্টিগ্রেশন এপিআই গেটওয়ে এ, এপিআই গেটওয়ে হবে পে লোড মধ্যে ল্যামডা প্রক্সি সবকিছু এটার মত,

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

উদাহরণস্বরূপ আপনি উল্লেখ করছেন, এটি মূল অনুরোধ থেকে শরীরটি পাচ্ছে না। এটি এপিআই গেটওয়েতে ফিরে প্রতিক্রিয়াটি তৈরি করছে। এটি এই ফর্ম্যাটে থাকা উচিত,

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

25
এবং তারপরে JSON.parse (ইভেন্ট.বডি) (ল্যাম্বদা প্রক্সি ইন্টিগ্রেশন)
টিমহেসি 22

4
@ টিএমএইচসি 22 এটি মূল বক্তব্য, একটি একক লাইনটি গ্রহণযোগ্য উত্তর হওয়া উচিত
5413668060

53

আমি মনে করি লাম্বদার সাথে এপিআই গেটওয়ে ইন্টিগ্রেশন নিয়ে কাজ করার সময় কয়েকটি জিনিস বুঝতে হবে।

ল্যাম্বদা ইন্টিগ্রেশন বনাম ল্যাম্বদা প্রক্সি ইন্টিগ্রেশন

এখানে কেবল লাম্বদা ইন্টিগ্রেশন ছিল যার জন্য ম্যাপিংয়ের টেমপ্লেটগুলি দরকার। আমি মনে করি এটি এজন্য এখনও এটি ব্যবহার করে অনেক উদাহরণ দেখছে।

  • অ্যামাজন এপিআই গেটওয়ে থেকে কীভাবে কোনও ক্যুস্ট্রিং বা রুট প্যারামিটারটি এডাব্লুএস ল্যাম্বডায় পাস করবেন

    সেপ্টেম্বর 2017 পর্যন্ত, আপনাকে আর অনুরোধের বডিটি অ্যাক্সেস করতে ম্যাপিং কনফিগার করতে হবে না।

  • AWS এ সার্ভারলেস আর্কিটেকচার

    ল্যাম্বদা প্রক্সি ইন্টিগ্রেশন, আপনি যদি এটি সক্ষম করে থাকেন তবে, এপিআই গেটওয়ে প্রতিটি অনুরোধ জেএসএনে ম্যাপ করবে এবং ইভেন্ট অবজেক্ট হিসাবে এটি ল্যাম্বডায় পাস করবে। লাম্বদা ফাংশনে আপনি কোয়েরি স্ট্রিং প্যারামিটার, শিরোনাম, স্টেজ ভেরিয়েবলস, পাথ প্যারামিটারগুলি, অনুরোধের প্রসঙ্গে এবং এর থেকে বডিটি পুনরুদ্ধার করতে সক্ষম হবেন।

    ল্যাম্বদা প্রক্সি ইন্টিগ্রেশন সক্ষম না করেই, আপনাকে এপিআই গেটওয়ের ইন্টিগ্রেশন রিকোয়েস্ট বিভাগে একটি ম্যাপিং টেমপ্লেট তৈরি করতে হবে এবং কীভাবে নিজে জেএসএন-তে এইচটিটিপি অনুরোধটি ম্যাপ করবেন তা ঠিক করতে হবে। আপনি যদি ক্লায়েন্টকে তথ্য ফেরত পাঠাতে চান তবে আপনাকে সম্ভবত একটি ইন্টিগ্রেশন রেসপন্স ম্যাপিং তৈরি করতে হবে।

    লাম্বদা প্রক্সি ইন্টিগ্রেশন যুক্ত হওয়ার আগে, ব্যবহারকারীরা ম্যানুয়ালি অনুরোধ এবং প্রতিক্রিয়াগুলি ম্যাপ করতে বাধ্য হয়েছিল, যা বিশেষত আরও জটিল ম্যাপিংয়ের সাথে প্রতিরোধের উত্স ছিল

শরীর JSON নয়, স্ট্রিং এড়িয়ে গেছে

ল্যাম্বদা প্রক্সি ইন্টিগ্রেশন ব্যবহার করে, ল্যাম্বডায়ার ক্ষেত্রে দেহটি একটি জেএসওএন নয়, ব্যাকস্ল্যাশ দিয়ে পালানো একটি স্ট্রিং।

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

যদি কোনও JSON ফর্ম্যাটারে পরীক্ষা করা হয়।

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

নীচের দস্তাবেজটি প্রতিক্রিয়া সম্পর্কে তবে এটি অনুরোধের জন্য প্রয়োগ করা উচিত।

জাভাস্ক্রিপ্ট এটি JSON অবজেক্ট হিসাবে অ্যাক্সেস করার জন্য এটিকে জাপাস্ক্রিপ্টে json.parse, পাইথনের json.dumps এর সাথে JSON অবজেক্টে ফিরে রূপান্তর করতে হবে।

ডেস্কটপ AWS ডকুমেন্টেশন শো কি করতে হবে তা।

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

1

আমি জাম্পার সাথে ল্যাম্বডা ব্যবহার করছি; আমি জসন ফর্ম্যাটে পোস্টের সাথে ডেটা পাঠাচ্ছি:

বেসিক_লম্বদা_পিউরি.পি. এর জন্য আমার কোডটি হ'ল:

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 এনকোডেড রয়েছে, আমি এটি কীভাবে জানতে পারি? আমি কীটি বেসড 64 এনকোডড দেখেছি

আমি বডি কীটির জন্য মানটি অনুলিপি করছি এবং এই সরঞ্জামটি এবং "ইউরেকা" দিয়ে ডিকোড করব, আমি মানগুলি পাই।

আমি আশা করি এটি আপনাকে সাহায্য করবে :)


0

আপনি Content-Typeহেডারের সংজ্ঞা দিতে ভুলে গেছেন । উদাহরণ স্বরূপ:

  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ items }),
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.