如何在 AWS lambda 函数中调用外部 API 或 URL(python 代码)?

How to call an external API or URL ( python code) in AWS lambda function?

下面给出了我在 AWS lambda 中调用 API 的代码。 urlilb3 python 库已成功上传为 zip 文件夹。但是当我尝试访问它显示的特定意图时

当我在 AWS lambda (python 3.6) 中包含 API 调用时,我得到

"The remote endpoint could not be called, or the response it returned was invalid" .

为什么会这样?在 python 3.6 中包含 API 调用之前需要完成哪些先决条件。我使用了 urllib3 python 库并上传为 zip 文件夹。??还需要做其他事情吗??

def get_weather(session):
    should_end_session = False
    speech_output = " "
    reprompt_text = ""
    api = "some url ...."
    http = urllib3.PoolManager()
    response = http.request('GET',api)
    weather_status = json.loads(response.data.decode('utf-8'))
    for weather in weather_status:
        final_weather = weather["WeatherText"]
    return build_response(session_attributes, build_speechlet_response(speech_output, reprompt_text, should_end_session)) 

尝试打印 response.data 以便您可以在日志中看到它。这可能会给你一个线索。我也会尝试切换到 Python Requests 而不是 URLLib3。您可能还需要根据您调用的 API 的实现设置内容类型。

from __future__ import print_function
import json
from botocore.vendored import requests
def lambda_handler(event, context):
   print('received request: ' + str(event))
   doctor_intent = event['currentIntent']['slots']['doctor']
   email_intent = event['currentIntent']['slots']['email']
   print(doctor_intent, email_intent)
   print(type(doctor_intent), type(email_intent))
   utf8string = doctor_intent.encode("utf-8")
   utf8string1 = email_intent.encode("utf-8")
   print(type(utf8string))
   print(type(utf8string1))
   car1 = {"business_name": utf8string , "customer_email": utf8string1 }  
   r = requests.post('https://postgresheroku.herokuapp.com/update', 
   json=car1)
   #print ("JSON         : ", r.json())
   print(r.json())
   data = str(r.json())
   print(type(data))
   return {
    "dialogAction": {
    "type": "Close",
    "fulfillmentState": "Fulfilled",
    "message": {
        "contentType": "PlainText",
        "content": "Thank you for booking appointment with {doctor} 
{response}".format(doctor=doctor_intent,response=data)
     }
    }
   }

场景:使用第三方获取天气API

 import urllib3

 def get_weather():
    api = "some url ...."
    http = urllib3.PoolManager()
    response = http.request('GET',api)
    weather_status = json.loads(response.data.decode('utf-8'))
    for weather in weather_status:
        final_weather = weather["WeatherText"] ## The attribute "WeatherText" will varies depending upon the weather API you are using.  
    return final_weather 

    get_weather() # simple function call