RequestType - The request type.ResponseType - The response type.public abstract class ProvidenceHttpServlet<RequestType extends net.morimekta.providence.PMessage<RequestType>,ResponseType extends net.morimekta.providence.PMessage<ResponseType>>
extends javax.servlet.http.HttpServlet
Note that the ProvidenceHttpServlet is NOT usable for
thrift services, but is meant to be used to make simple POST based
HTTP servlets.
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);
}
}
This will result in a simple HTTP servlet that can be queries with CURL
e.g. like this:
# 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\"}
Alternatively you can hijack the whole exception / error response handling, which
might be needed where custom headers etc are needed, e.g. with 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);
}
}
handle(HttpServletRequest, PMessage): The main handle method. This must be
implemented.
| Constructor and Description |
|---|
ProvidenceHttpServlet(net.morimekta.providence.descriptor.PMessageDescriptor<RequestType> requestDescriptor,
ExceptionHandler exceptionHandler,
net.morimekta.providence.serializer.SerializerProvider serializerProvider) |
| Modifier and Type | Method and 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.
|
doDelete, doGet, doHead, doOptions, doPut, doTrace, getLastModified, service, servicepublic ProvidenceHttpServlet(@Nonnull net.morimekta.providence.descriptor.PMessageDescriptor<RequestType> requestDescriptor, @Nullable ExceptionHandler exceptionHandler, @Nullable net.morimekta.providence.serializer.SerializerProvider serializerProvider)
@Nonnull protected abstract ResponseType handle(@Nonnull javax.servlet.http.HttpServletRequest httpRequest, @Nonnull RequestType request) throws Exception
httpRequest - The HTTP request.request - The parsed providence request.Exception - On any internal exception.protected final void doPost(javax.servlet.http.HttpServletRequest httpRequest,
javax.servlet.http.HttpServletResponse httpResponse)
throws IOException
doPost in class javax.servlet.http.HttpServletIOExceptionCopyright © 2015–2020 morimekta.net. All rights reserved.