Package net.morimekta.providence.server
Class ProvidenceHttpServlet<RequestType extends PMessage<RequestType>,ResponseType extends PMessage<ResponseType>>
- java.lang.Object
-
- javax.servlet.GenericServlet
-
- javax.servlet.http.HttpServlet
-
- net.morimekta.providence.server.ProvidenceHttpServlet<RequestType,ResponseType>
-
- Type Parameters:
RequestType
- The request type.ResponseType
- The response type.
- All Implemented Interfaces:
java.io.Serializable
,javax.servlet.Servlet
,javax.servlet.ServletConfig
public abstract class ProvidenceHttpServlet<RequestType extends PMessage<RequestType>,ResponseType extends PMessage<ResponseType>> extends javax.servlet.http.HttpServlet
A simple HTTP POST servlet that simply deserializes the POST body as a providence message, and serializes the response message using the requested content type or accept type.Note that the
ProvidenceHttpServlet
is NOT usable for thrift services, but is meant to be used to make simple POST based HTTP servlets.
This will result in a simple HTTP servlet that can be queries with CURL e.g. like this:public class MyServlet extends ProvidenceHttpServlet< MyRequest, MyRequest._Field, MyResponse, MyResponse._Field> { {@literal@}Override protected MyResponse handle(HttpServletRequest httpRequest, MyRequest request) throws MyException, InternalFailureException { // ... do stuff with request, or throw MyException or IFE. return MyResponse.builder() .setFieldOut("yes") .build(); } {@literal@}Override protected int statusCodeForException({@literal@}Nonnull Throwable exception) { if (exception instanceof MyException) { return HttpStatus.BAD_REQUEST_400; } return super.statusCodeForException(ex); } }
Alternatively you can hijack the whole exception / error response handling, which might be needed where custom headers etc are needed, e.g. with# Simple success $ curl -sS -X POST -d "{\"field_in\": \"value\"}" \ > -H "Content-Type: application/json" \ > localhost:8080/my/servlet {\"field_out\":\"yes\"} # Simple Error $ curl -sSv -X POST -d "{\"field_in\": \"not valid\"}" \ > -H "Content-Type: application/json" \ > localhost:8080/my/servlet ... > Content-Type: application/json > Accept: *{@literal/}* ... < HTTP/1.1 400 Bad Request < Content-Type: application/json ... {\"text\":\"not valid value\"}
Unauthorized (401)
:public class MyServlet extends ProvidenceHttpServlet< MyRequest, MyRequest._Field, MyResponse, MyResponse._Field> { public MyServlet() { super(MyRequest.kDescriptor, new MyExceptionHandler(), DefaultSerializerProvider.INSTANCE); } {@literal@}Override protected MyResponse handle(HttpServletRequest httpRequest, MyRequest request) throws MyException, InternalFailureException { // ... do stuff with request, or throw MyException or IFE. return MyResponse.builder() .setFieldOut("yes") .build(); } }
public class MyExceptionHandler extends ExceptionHandler { {@literal@}Override protected void writeErrorResponse( {@literal@}Nonnull Throwable exception, {@literal@}Nonnull Serializer responseSerializer, {@literal@}Nonnull HttpServletRequest httpRequest, {@literal@}Nonnull HttpServletResponse httpResponse) throws IOException { if (exception instanceof MyException) { httpResponse.setStatus(HttpStatus.UNAUTHORIZED_401); httpResponse.setHeader(HttpHeaders.WWW_AUTHENTICATE, "www.my-domain.com"); responseSerializer.serialize(httpResponse.getOutputStream(), (MyException) exception); return; } super.writeErrorResponse(exception); } }
Overridable Methods
-
: The main handle method. This must be implemented.handle(HttpServletRequest, PMessage)
- Since:
- 1.6.0
- See Also:
- Serialized Form
-
-
Constructor Summary
Constructors Constructor Description ProvidenceHttpServlet(PMessageDescriptor<RequestType> requestDescriptor, ExceptionHandler exceptionHandler, SerializerProvider serializerProvider)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
doPost(javax.servlet.http.HttpServletRequest httpRequest, javax.servlet.http.HttpServletResponse httpResponse)
protected abstract ResponseType
handle(javax.servlet.http.HttpServletRequest httpRequest, RequestType request)
Handle the request itself as a simple called method.-
Methods inherited from class javax.servlet.http.HttpServlet
doDelete, doGet, doHead, doOptions, doPut, doTrace, getLastModified, service, service
-
-
-
-
Constructor Detail
-
ProvidenceHttpServlet
public ProvidenceHttpServlet(@Nonnull PMessageDescriptor<RequestType> requestDescriptor, @Nullable ExceptionHandler exceptionHandler, @Nullable SerializerProvider serializerProvider)
-
-
Method Detail
-
handle
@Nonnull protected abstract ResponseType handle(@Nonnull javax.servlet.http.HttpServletRequest httpRequest, @Nonnull RequestType request) throws java.lang.Exception
Handle the request itself as a simple called method.- Parameters:
httpRequest
- The HTTP request.request
- The parsed providence request.- Returns:
- The response object.
- Throws:
java.lang.Exception
- On any internal exception.
-
doPost
protected final void doPost(javax.servlet.http.HttpServletRequest httpRequest, javax.servlet.http.HttpServletResponse httpResponse) throws java.io.IOException
- Overrides:
doPost
in classjavax.servlet.http.HttpServlet
- Throws:
java.io.IOException
-
-