In this post I'm going to tell how to export a file or Serialzable java object in the server using a REST api call.
From the client's perspective he is downloading a file.
If you want to enable downloading a file in the server you can do it in the following way.
This example send an object type of MLModel as a stream.
[1] http://examples.javacodegeeks.com/enterprise-java/rest/jax-rs-download-file/
[2] http://stackoverflow.com/questions/10100936/file-downloading-in-restfull-web-services
[3] http://howtodoinjava.com/2013/05/10/resteasy-file-download-example/
[4] http://rest.elkstein.org/2008/02/using-rest-in-java.html
[5] http://java.dzone.com/articles/streaming-apis-json-vs-xml-and
[6] http://stackoverflow.com/questions/29640523/streaming-the-result-of-rest-api-from-twitter
[7] http://stackoverflow.com/questions/3496209/input-and-output-binary-streams-using-jersey
[8] http://stackoverflow.com/questions/23421967/jax-rs-send-serialized-objects
[9] https://developer.jboss.org/thread/174955
[10] http://www.ibm.com/developerworks/library/j-5things1/
[11] http://www.postseek.com/meta/8ee7d7c8a67ab5f555f0403d19d27dd9 -
From the client's perspective he is downloading a file.
If you want to enable downloading a file in the server you can do it in the following way.
@GET @Path("/{modelName}") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response exportFile(@PathParam("modelName") String modelName) { try { MLModelNew model = mlModelHandler.getModel(tenantId, userName, modelName); if(model != null) { String filePath = model.getStorageDirectory(); File file = new File(filePath); return Response.ok(file).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } } catch (MLModelHandlerException e) { logger.error(String.format( "Error while retrieving model [name] %s. Cause: %s", modelName, e.getMessage())); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } }There's another useful scenario of downloading a java serializable object as it is. This can be done by sending it as a stream. Here is how you can send a java object as a stream.
This example send an object type of MLModel as a stream.
@GET @Path("/{modelName}") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response exportModel(@PathParam("modelName") String modelName) { try { MLModelNew model = mlModelHandler.getModel(tenantId, userName, modelName); if(model != null) { final MLModel generateModel = mlModelHandler.retrieveModel(model.getId()); StreamingOutput stream = new StreamingOutput() { public void write(OutputStream outputStream) throws IOException { ObjectOutputStream out = new ObjectOutputStream(outputStream); out.writeObject(generateModel); } }; return Response.ok(stream).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } } catch (Exception e) { logger.error(String.format( "Error while retrieving model [name] %s. Cause: %s", modelName, e.getMessage())); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } }References :
[1] http://examples.javacodegeeks.com/enterprise-java/rest/jax-rs-download-file/
[2] http://stackoverflow.com/questions/10100936/file-downloading-in-restfull-web-services
[3] http://howtodoinjava.com/2013/05/10/resteasy-file-download-example/
[4] http://rest.elkstein.org/2008/02/using-rest-in-java.html
[5] http://java.dzone.com/articles/streaming-apis-json-vs-xml-and
[6] http://stackoverflow.com/questions/29640523/streaming-the-result-of-rest-api-from-twitter
[7] http://stackoverflow.com/questions/3496209/input-and-output-binary-streams-using-jersey
[8] http://stackoverflow.com/questions/23421967/jax-rs-send-serialized-objects
[9] https://developer.jboss.org/thread/174955
[10] http://www.ibm.com/developerworks/library/j-5things1/
[11] http://www.postseek.com/meta/8ee7d7c8a67ab5f555f0403d19d27dd9 -