Использование класса HttpServlet для задания обработчика на Java
Вы можете задать обработчик на Java, переопределив выбранные методы класса HttpServlet
Сервис Cloud Functions будет автоматически перенаправлять каждый HTTP-запрос в ваш обработчик, в зависимости от HTTP-метода, с которым этот запрос был инициирован. Например, GET-запрос будет перенаправлен в метод doGet вашего обработчика, а POST — в doPost. Для успешного перенаправления соответствующие методы обработчика должны существовать, иначе ответом функции будет сообщение HTTP method XXX is not supported by this URL с кодом 405.
Неподдерживаемые методы
При использовании данной модели, обратите внимание на то, что некоторые методы классов HttpServletRequest
HttpServletRequest:
- getAuthType
- getCookies
- upgrade
- authenticate
- login
- logout
- getContextPath
- getServletPath
- getPathTranslated
- getRealPath
- getRemotePort
- getLocalAddr
- getLocalPort
- getServerPort
- isUserInRole
- getUserPrincipal
- getRequestedSessionId
- getSession
- changeSessionId
- isRequestedSessionIdValid
- isRequestedSessionIdFromCookie
- isRequestedSessionIdFromURL
- isRequestedSessionIdFromUrl
HttpServletResponse:
- encodeURL
- encodeRedirectURL
- encodeUrl
- encodeRedirectUrl
Пример: моделирование различного поведения функции при вызове с разными HTTP-методами
Важно
Не используйте для вызова этой функции параметр ?integration=raw. При применении этого параметра функция не получает данных о методах, заголовках и параметрах исходного запроса.
Cloud Functions поддерживает Maven — систему управления зависимостями для языка Java.
Чтобы создать функцию:
- Создайте файл
Handler.javaпо пути/src/main/java/Handler.javaи файлpom.xml. - Добавьте в ZIP-архив директорию
/srcи файлpom.xml. - Загрузите ZIP-архив в Cloud Functions.
Файл pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my.company.app</groupId>
<artifactId>servlet</artifactId>
<version>1</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Файл Handler.java:
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Handler extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// выставив значение Content-Type в text/html, позволяем браузеру рендерить html код
response.setContentType("text/html");
// отобразится в виде полужирной строки при вызове функции из браузера
response.getOutputStream().print("<b>Hello, world. In bold.</b>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
var name = request.getParameter("name");
response.getWriter().println("Hello, " + name);
// printWriter, возвращаемый методом getWriter, нужно обязательно закрывать
response.getWriter().close();
}
}
Примеры запросов:
Метод: GET:
<b>Hello, world. In bold.</b>
Примечание
При выполнении GET-запроса в браузере данная строка отобразится в полужирном шрифте, а теги пропадут, так как был указан Content-Type: text/html в коде обработчика.
Метод POST, параметр запроса name=Anonymous:
Hello, Anonymous
Метод PUT:
HTTP method PUT is not supported by this URL
Пример: вывод информации о функции
Следующая функция выводит свои метаданные, взятые из контекста вызова.
Файл pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my.company.app</groupId>
<artifactId>servlet</artifactId>
<version>1</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Файл Handler.java:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Handler extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String requestId = request.getHeader("Lambda-Runtime-Aws-Request-Id");
String functionId = request.getHeader("Lambda-Runtime-Function-Name");
String versionId = request.getHeader("Lambda-Runtime-Function-Version");
String memoryLimit = request.getHeader("Lambda-Runtime-Memory-Limit");
String tokenJson = request.getHeader("Lambda-Runtime-Token-Json");
response.getOutputStream().print(String.format(
"RequestID: %s\n" +
"FunctionID: %s\n" +
"VersionID: %s\n" +
"MemoryLimit: %s\n" +
"TokenJSON: %s",
requestId,
functionId,
versionId,
memoryLimit,
tokenJson
));
}
}
Пример запроса:
{
"httpMethod": "GET",
"requestContext": {},
"body": "",
"isBase64Encoded": true
}
Пример ответа:
{
"multiValueHeaders": {
"Content-Type": [
"application/json"
]
},
"isBase64Encoded": false,
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "
RequestID: 6ccf3084-a92a-43a4-9122-5520********\n
FunctionID: b09hcbdla2ro********\n
VersionID: b09h91stkts4********\n
MemoryLimit: 1024\n
TokenJSON:
"
}