2017-01-14 23 views
12

Tôi hiện đang sử dụng NodeJS để xây dựng bot trên AWS lambda qua AWS Api Gateway và tôi đang gặp sự cố với yêu cầu POST và dữ liệu JSON. Api của tôi sử dụng 'Sử dụng tích hợp Proxy Lambda' và thậm chí khi tôi kiểm tra proxy gửi một kiểu nội dung của Ứng dụng/json và một số json trong cơ thể, ví dụ: {"foo":"bar"} Tôi không thể truy cập đối tượng mà không phân tích cú pháp đầu tiênBắt cơ thể json trong aws Lambda qua cổng API

ví dụ:

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

Bây giờ tôi biết điều này dường như không phải là vấn đề lớn khi chạy nó thông qua JSON.parse, nhưng tôi đã thấy một số ví dụ khác mà đây không phải là trường hợp nào cả. xem tại đây https://github.com/pinzler/fb-messenger-bot-aws-lambda/blob/master/index.js

Tôi có cần phải thêm bất kỳ thứ gì vào cổng API của mình để xử lý chính xác không? bước 'yêu cầu của tôi' trong phần 'yêu cầu phương thức đăng bài' có nội dung kiểu ứng dụng/thiết lập json cho phần thân yêu cầu.

Các readme ví dụ ở trên dường như không sử dụng tích hợp ủy quyền như xa như tôi có thể nói vì vậy tôi không chắc chắn những gì tôi nên làm gì ở đây

Trả lời

15

Có hai tích hợp Lambda khác nhau mà bạn có thể cấu hình trong Cổng API, chẳng hạn như tích hợp Lambda và tích hợp proxy Lambda. Đối với Tích hợp Lambda, bạn có thể tùy chỉnh những gì bạn sẽ chuyển tới Lambda trong tải trọng mà bạn không cần phân tích cú pháp nội dung, nhưng khi bạn đang sử dụng Tích hợp Proxy Lambda trong Cổng API, API Gateway sẽ ủy quyền mọi thứ để Lambda trong tải trọng như thế này,

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

Ví dụ bạn đang tham chiếu, nó không nhận được nội dung từ yêu cầu ban đầu. Nó đang xây dựng cơ thể phản hồi trở lại API Gateway. Định dạng này phải ở định dạng này,

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

và sau đó là JSON.parse (event.body) (tích hợp Proxy Lambda) – timhc22

0

Tôi đang sử dụng lambda với Zappa; Tôi gửi dữ liệu với POST ở định dạng json:

Mã của tôi cho basic_lambda_pure.py là:

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'}} 

tôi đều có phản ứng json tiếp theo:

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

dữ liệu của tôi là trên cơ thể khóa, nhưng được mã hóa mã hóa64, Làm thế nào tôi có thể biết điều này? Tôi thấy chìa khóa isBase64Encoded

tôi sao chép các giá trị cho cơ thể chìa khóa và giải mã với This tool và "eureka", tôi nhận được các giá trị.

Tôi hy vọng điều này sẽ giúp bạn. :)

Các vấn đề liên quan