Как вы называете AWS Lamda из AWS API Gateway в Scala? - PullRequest
0 голосов
/ 01 декабря 2018

Я создал экземпляр AWS API Gateway для AWS Lambda.

Как я могу обрабатывать методы HTTP в функции Lamda?

Мой пример кода:

    class ApiGatewayHandler extends RequestHandler[Request, ApiGatewayResponse] {

  def handleRequest(input: Request, context: Context): ApiGatewayResponse = {

    val headers = Map("x-custom-response-header" -> "my custom response header value")
    ApiGatewayResponse(200, "Go Serverless v1.0! Your function executed successfully!",
      JavaConverters.mapAsJavaMap[String, Object](headers),
      true)
  }
}

Класс запроса:

class Request(@BeanProperty var key1: String, @BeanProperty var key2: String, @BeanProperty var key3: String) {
  def this() = this("", "", "")
}

Как обрабатывать различные методы HTTP?Какие библиотеки мне следует использовать?

1 Ответ

0 голосов
/ 03 декабря 2018

AWS API Gateway позволяет передавать информацию, такую ​​как метод HTTP, путь запроса, заголовки и т. Д., В AWS Lambda с помощью Lambda Proxy Integration .

После настройки этого параметра.успешно включите в ваш проект библиотеки aws-lambda-java-core и aws-lambda-java-events .

В SBT:

libraryDependencies ++= Seq(
   "com.amazonaws" % "aws-lambda-java-core" % "1.2.0",
   "com.amazonaws" % "aws-lambda-java-events" % "2.2.3"
)

Это официальные библиотеки AWS для разработки лямбда-функций AWS в Java / Scala.

Кроме того, вам потребуется библиотека обработки JSON, например, circe .

В SBT:

val circeVersion = "0.10.0"

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core",
  "io.circe" %% "circe-generic",
  "io.circe" %% "circe-parser"
).map(_ % circeVersion)

Теперь вы можете легко адаптировать ваш обработчик для использования новой модели:

import scala.collection.JavaConverters._
import com.amazonaws.services.lambda.runtime.events.{APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent}
import com.amazonaws.services.lambda.runtime.{Context, RequestHandler}
import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._
// TODO: Import your Request class!

object Handler extends RequestHandler[APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent] {

  override def handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent = {

    def log(message: String): Unit = context.getLogger.log(message)

    log("--- Received new request ---")
    log(s"Method: '${input.getHttpMethod}'") // Example use of HTTP method
    log(s"Proxy Path: '${input.getPath}'") // Example use of request path

    val request = decode[Request](input.getBody) // Decode request using circe

    request match {
        case Right(req) => // TODO: Implement business logic
        case Left(req) => // TODO: Implement error handling
    }

    val response = new APIGatewayProxyResponseEvent() // Example for a response
        .withStatusCode(200)
        .withHeaders(
            Map(
                "Content-Type" -> "text/raw",
                // TODO: Add your own headers
            ).asJava // Convert the Scala Map to a Java Map
        )
        .withBody("Under construction!") // Or use circe again to encode a POJO

    response // Return the response
  }
}

Iне удалось полностью протестировать этот пример, поэтому обязательно вернитесь с любыми проблемами, с которыми вы можете столкнуться.

Кстати, сообщения журнала, которые выдает ваша функция AWS Lambda, можно найти в AWS Cloudwatch.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...