Handling 'MULTIPART/MIXED' using Jersery Apis.
Jars required:
a. ) jersey-bundle-1.13.jar
b. ) jersey-multipart-1.13.jar
Jersey Client to POST Multipart Http Request
______________________________________--
Lets build a client that requires to POST to a REST resource a multipart request that has two body parts
1. An xml Input : This is the first body part. Let the JAXB object created for this be Represented by MyEntity E
2. Byte[] array : This array of bytes is the second body part. This byte array is the content of the file that needs to imported , along with the above xml input
So the aim is to create a jersery client and post a multipart request.
String fileImporUrl = "URl to the resource that would handle this request"
Client c = Client.create();
WebResource service = c.resource(fileImporUrl );
// Construct a MultiPart with two body parts
// Construct the JAXB object for the Input Xml
MyEntity E = new MyEntity ();
// E.setname( "anbc" );
//E.setId(123 );
.............
..... Build the Entity
// read the file and get bytes to import
byte[] bytesToImport = getBytesToImport();
// Construct Multipart Request. Content-type of the first part is 'application/xml '
// and second part is 'appication/octet-stream'
MultiPart multiPart = new MultiPart().
bodyPart(new BodyPart(E, MediaType.APPLICATION_XML_TYPE)).
bodyPart(new BodyPart(bytesToImport, MediaType.APPLICATION_OCTET_STREAM_TYPE));
// POST the request
ClientResponse response = service.path("/import").
type("multipart/mixed").header( headerKey, headerValue).post(ClientResponse.class, multiPart);
System.out.println( "Import Response status = " + response.getStatus() );
/////////////// A FileImport Resource that would consume this Multipart Request ///////////////////////
@POST
@Consumes("multipart/mixed")
@Produces({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
public Response importFile(MultiPart multipart, @Context HttpHeaders headers, @Context UriInfo uriInfo) // add other context if required
{
final int INDEX_XML = 0; final int INDEX_FILE_CONTENT = 1; MultipartBodyEntityContent bodyEntityContent = new MultipartBodyEntityContent(); MyEntity E = null; BodyPartEntity fileContentAsBodyPart = null; try { E = multipart.getBodyParts().get(INDEX_XML).getEntityAs(MyEntity.class); fileContentAsBodyPart = (BodyPartEntity) multipart.getBodyParts().get(INDEX_FILE_CONTENT).getEntity(); byte[] byteContent = getByteArrayFromInputStream( fileContentAsBodyPart .getInputStream() );
// Process the MyEntity E and byteContent and return Response }
}
// get byte[] from Input Stream byte[] getByteArrayFromInputStream(InputStream in) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[4096]; while ((nRead = in.read(data, 0, data.length)) != -1) buffer.write(data, 0, nRead); buffer.flush(); buffer.close(); return buffer.toByteArray(); }
No comments:
Post a Comment