Sending and receiving XML in a Java application Sean C. Sullivan sean seansullivan com September 2003
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
XML Sun Microsystems SUNW XML is a syntax for describing and structuring data
Application integration “[If you look at] where XML is really, truly being used right now, it's [for] lightweight, quick and dirty enterprise application integration. […] you could achieve remarkably acceptable results in enterprise application integration simply by binding a set of XML messages to ship back and forth.” Tim Bray, 9/23/2003, news.com interview
Data exchange Application BApplication A
XML request OVERNIGHT
XML response 68.00
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
HTTP protocol HTTP server HTTP client request
HTTP protocol HTTP server HTTP client request response
HTTP protocol methods GET POST HEAD …
HTTP headers Content-Type Accept
MIME types for XML text/xml application/xml text/xml-external-parsed-entity application/xml-external-parsed-entity application/xml-dtd application/soap+xml
Jakarta Commons HTTPClient
Example: HTTP POST import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods*; PostMethod post = new PostMethod( “ post.setRequestBody(strXML); post.setRequestHeader( “Content-type”, “application/xml”);
Example: HTTP POST post.setRequestHeader( “Accept”, “application/xml”); HttpClient client = new HttpClient(); int result = client.executeMethod(post); // … String strXMLResponse = post.getResponseBodyAsString(); post.releaseConnection();
Receiving XML using a Servlet public class XMLServlet extends javax.servlet.http.HttpServlet { protected void doPost( HttpServletRequest req, HttpServletResponse resp) { // … method implementation … }
doPost method // … String type = req.getContentType(); int contentLength = req.getContentLength(); char[] xmlData = new char[contentLength]; BufferedReader reader = httpRequest.getReader(); // …
doPost (continued) do { n = reader.read(xmlData, bytesRead, xmlData.length - bytesRead); if (n > 0) { bytesRead += n; } } while ( (n != -1) && (bytesRead < contentLength) )
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
Java Message Service messaging API for J2EE platform Point-to-point –JMS Queue Publish-Subscribe –JMS Topic “at most once” delivery mode transactional
JMS message queue Message Producer Message Queue 123 Message Consumer
Sending XML using JMS import javax.jms.*; import javax.naming.*; Queue queue; ConnectionFactory cf; queue = /* lookup via JNDI */; cf = /* lookup via JNDI */; Connection conn = cf.createConnection(); Session session = conn.createSession(…);
Sending XML using JMS MessageProducer producer; producer = session.createProducer(queue); TextMessage msg; msg = session.createTextMessage(); msg.setText(strXML); producer.send(msg); session.commit();
Receiving XML via JMS Choose one: javax.jms.MessageConsumer Message Driven Bean (MDB)
Example: Message Driven Bean public void onMessage(Message msg) { // … if (msg instanceof TextMessage) { TextMessage tm = (Message) msg; String strXML = tm.getText(); } // … }
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
JavaMail
Example: XML via JavaMail import javax.mail.*; import javax.mail.internet.*; Session sess = /* JNDI lookup */; MimeMessage msg = new MimeMessage(sess); msg.setFrom(from); // …
Example: XML via JavaMail // … msg.setRecipients( Message.RecipientType.TO, recipients); msg.setSubject(“Hello XML”); // …
Example: XML via JavaMail // … MimeBodyPart mbp = new MimeBodyPart(); mbp.setContent(strXML, “application/xml”); Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp); msg.setContent(mp); Transport.send(msg); // …
Agenda XML XML via HTTP XML via JMS XML via JavaMail XML via FTP
FTP with Jakarta Commons Net
Example: XML via FTP import org.apache.commons.net.ftp.*; FTPClient ftp = new FTPClient(); ftp.connect(“ftp.example.com”); ftp.login(username, password);
Example: XML via FTP ftp.setFileType(FTP.BINARY_FILE_TYPE); ftp.enterLocalPassiveMode(); ftp.storeFile(“foo.xml”, xmlInputStream); ftp.logout(); ftp.disconnect();
Additional topics… Sockets SOAP XML-RPC Binary encodings for XML
Additional resources
Summary Use XML for data exchange between heterogeneous applications. Sending and receiving XML is easy.