Using the HttpServlet class to set a Java handler
You can set a Java handler by overriding selected methods of the HttpServlet
Cloud Functions will automatically route each HTTP request to your handler depending on the HTTP method used to initiate the request. For example, a GET request will be routed to your handler’s doGet method, and POST, to doPost. For successful routing, these handler methods must exist; otherwise the function will return HTTP method XXX is not supported by this URL with code 405.
Unsupported methods
When using this model, note that Cloud Functions does not support some methods of the 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
Example of modeling how the function behaves for different HTTP methods
Warning
Do not use ?integration=raw to invoke this function. If you do, the function will not get any data about the original request’s methods, headers, or parameters.
Cloud Functions supports Maven, which is a dependency management system for Java.
To create a function:
- Create a file named
Handler.javaat/src/main/java/Handler.javaand a file namedpom.xml. - Add the
/srcdirectory and thepom.xmlfile to a ZIP archive. - Upload the ZIP archive to 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 {
// With Content-Type set to text/html, the browser renders the HTML code.
response.setContentType("text/html");
// It will be displayed in bold when the function is called from a browser.
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);
// Make sure to close the PrintWriter returned by getWriter.
response.getWriter().close();
}
}
Request examples:
GET method:
<b>Hello, world. In bold.</b>
Note
Running a GET request in a browser will display this string in bold without any tags since you specified Content-Type: text/html in your handler's code.
POST method, name=Anonymous as your request parameter:
Hello, Anonymous
PUT method:
HTTP method PUT is not supported by this URL
Example of function information output
The following function outputs its metadata based on the invocation context.
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
));
}
}
Request example:
{
"httpMethod": "GET",
"requestContext": {},
"body": "",
"isBase64Encoded": true
}
Response example:
{
"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:
"
}