As Piranha Nano has been removed as an offering this content is no longer relevant
As I like to push boundaries I thought it would be nice to see if I can integrate a Servlet with Azure Functions.
Below is a simple HelloWorldServlet that illustrates it is indeed possible and actually very easy to do!
The code below is the 'Hello World' Servlet
public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter writer = response.getWriter(); writer.println("Hello World"); writer.flush(); } }
The code below is the Azure Function dispatching to the 'Hello World' Servlet
public class HelloWorldFunction { @FunctionName("/helloworld") public HttpResponseMessage run( @HttpTrigger( name = "request", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION ) HttpRequestMessage<Optional<String>> request, final ExecutionContext context) { NanoRequest nanoRequest = new NanoRequestBuilder() .method("GET") .servletPath("") .build(); ByteArrayOutputStream nanoOutputStream = new ByteArrayOutputStream(); NanoResponse nanoResponse = new NanoResponseBuilder() .outputStream(nanoOutputStream) .build(); String body = null; try { NanoPiranha nanoPiranha = new NanoPiranhaBuilder() .directoryResource("webapp") .servlet("Function Servlet", new HelloWorldServlet()) .build(); nanoPiranha.service(nanoRequest, nanoResponse); } catch (IOException | ServletException e) { body = e.getMessage(); } if (body == null) { body = nanoOutputStream.toString(); } return request.createResponseBuilder(HttpStatus.OK). body(body). build(); } }
As you can see this was all very easy to accomplish thanks to Piranha Nano.
A zip file that contains everything you need is available here
Posted February 16th, 2020