This is about how we can post XML data or data object to an URL( webservice URL or any other URL which can accept these POST request.)
Common Scenario: Lets say we are having data in some tables and we want to post /send these data in the form of xml request to some external URL( which can be a web service URL). We will convert each of these row data in to xml data object and will send this xml data object with the help marshalling/de-marshalling functionality and will do a POST request to the external URL.
Below is the XML data object used for carrying XML data .
TransactionXMLData Class:
package com.abc.xyz.xml.model; import java.util.Date; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Transaction") public class TransactionXMLData { @XmlElement(name = "TransactionId") private long transactionId; @XmlElement(name = "DCCode") private String dcCode; @XmlElement(name = "TransactionType") private String transactionType; @XmlElement(name = "TransactionDate") private Date transactionDate; @XmlElement(name = "SourceLicensePlateNo") private String sourceLicensePlateNo; @XmlElement(name = "DestLicensePlateNo") private String destLicensePlateNo; @XmlElement(name = "ProductId") private String productId; @XmlElement(name = "PerformedBy") private String performedBy; @XmlElement(name = "OrderId") private String orderId; @XmlElement(name = "OrderType") private String orderType; @XmlElement(name = "OrderLineNo") private String orderLineNo; public long getTransactionIdValue() { return transactionId; } public void setTransactionId(long transactionId) { this.transactionId = transactionId; } public String getDcCodeValue() { return dcCode; } public void setDcCode(String dcCode) { this.dcCode = dcCode; } public String getTransactionTypeValue() { return transactionType; } public void setTransactionType(String transactionType) { this.transactionType = transactionType; } public Date getTransactionDateValue() { return transactionDate; } public void setTransactionDate(Date transactionDate) { this.transactionDate = transactionDate; } public String getSourceLicensePlateNoValue() { return sourceLicensePlateNo; } public void setSourceLicensePlateNo(String sourceLicensePlateNo) { this.sourceLicensePlateNo = sourceLicensePlateNo; } public String getDestLicensePlateNoValue() { return destLicensePlateNo; } public void setDestLicensePlateNo(String destLicensePlateNo) { this.destLicensePlateNo = destLicensePlateNo; } public String getProductIdValue() { return productId; } public void setProductId(String productId) { this.productId = productId; } public String getPerformedByValue() { return performedBy; } public void setPerformedBy(String performedBy) { this.performedBy = performedBy; } public String getOrderIdValue() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getOrderTypeValue() { return orderType; } public void setOrderType(String orderType) { this.orderType = orderType; } public String getOrderLineNoValue() { return orderLineNo; } public void setOrderLineNo(String orderLineNo) { this.orderLineNo = orderLineNo; } }
WebServiceUploadConfig Class:
package com.abc.xyz; public class WebServiceUploadConfig { private String url; private String username; private String password; public WebServiceUploadConfig(String url) { super(); this.url = url; } public WebServiceUploadConfig(String url, String username, String password) { super(); this.url = url; this.username = username; this.password = password; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
WebServiceUploadException Class:
package com.abc.xyz.exception; public class WebServiceUploadException extends Exception { private static final long serialVersionUID = 1L; public WebServiceUploadException(String msg) { super(msg); } public WebServiceUploadException(Throwable t) { super(t); } public WebServiceUploadException(String msg, Throwable t) { super(msg, t); } }
WebServiceUploadAudit Class:
package com.abc.xyz.model.dataobjects; import java.util.Date; public class WebServiceUploadAudit { private long id; private long transactionId; private String transactionType; private String remoteHost; private String requestURL; private String requestBody; private Date sendDate; private String responseHeader; private String responseBody; private String host; private String userId; private boolean success; private String errorMessage; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getRemoteHost() { return remoteHost; } public void setRemoteHost(String remoteHost) { this.remoteHost = remoteHost; } public String getRequestURL() { return requestURL; } public void setRequestURL(String requestURL) { this.requestURL = requestURL; } public String getRequestBody() { return requestBody; } public void setRequestBody(String requestBody) { this.requestBody = requestBody; } public Date getSendDate() { return sendDate; } public void setSendDate(Date sendDate) { this.sendDate = sendDate; } public String getResponseHeader() { return responseHeader; } public void setResponseHeader(String responseHeader) { this.responseHeader = responseHeader; } public String getResponseBody() { return responseBody; } public void setResponseBody(String responseBody) { this.responseBody = responseBody; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public boolean getSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public long getTransactionId() { return transactionId; } public void setTransactionId(long transactionId) { this.transactionId = transactionId; } public String getTransactionType() { return transactionType; } public void setTransactionType(String transactionType) { this.transactionType = transactionType; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } }
XMLConverter Class:
package com.abc.xyz; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.log4j.Logger; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; public class XMLConverter { Logger logger = Logger.getLogger(XMLConverter.class); private Marshaller marshaller; private Unmarshaller unmarshaller; public Marshaller getMarshaller() { return marshaller; } public void setMarshaller(Marshaller marshaller) { this.marshaller = marshaller; } public Unmarshaller getUnmarshaller() { return unmarshaller; } public void setUnmarshaller(Unmarshaller unmarshaller) { this.unmarshaller = unmarshaller; } public void convertFromObjectToOutPutStream(Object object,OutputStream os) throws IOException { if (logger.isInfoEnabled()) { logger.info("converting object to xml"); } try { getMarshaller().marshal(object, new StreamResult(os)); } finally { if (os != null) { os.close(); } } } public Object convertFromXMLToObject(String xmlfile) throws IOException { if (logger.isInfoEnabled()) { logger.info("converting xml to object"); } FileInputStream is = null; try { is = new FileInputStream(xmlfile); return getUnmarshaller().unmarshal(new StreamSource(is)); } finally { if (is != null) { is.close(); } } } }
WebServiceUploadAuditDAO Class:
package com.abc.xyz.dao; import com.abc.xyz.model.dataobjects.WebServiceUploadAudit; public interface WebServiceUploadAuditDAO { public void save(WebServiceUploadAudit audit); }
WebServiceUploadAuditDAOImpl Class:
package com.abc.xyz.dao; import org.apache.log4j.Logger; import org.springframework.jdbc.core.JdbcTemplate; import com..abc.xyz.model.dataobjects.WebServiceUploadAudit; public class WebServiceUploadAuditDAOImpl implements WebServiceUploadAuditDAO { Logger logger = Logger.getLogger(WebServiceUploadAuditDAOImpl.class); private JdbcTemplate jdbcTemplate; public void save(WebServiceUploadAudit audit) { if (logger.isInfoEnabled()) { logger.info("Inserting Data in WEBSERVICE_UPLOAD_LOG table"); } String insertQuery = "INSERT INTO WEBSERVICE_UPLOAD_LOG(ID,REMOTE_HOST,REQUEST_URL,SEND_DATE,HOST,USER_ID,SUCCESS_IND,ERROR_MESSAGE,TRANSACTION_ID,TRANSACTION_TYPE,REQUEST_BODY,RESPONSE_HEADER,RESPONSE_BODY)values(WEBSERVICE_UPLOAD_LOG_SEQ.nextval,?,?,?,?,?,?,?,?,?,?,?,?)"; jdbcTemplate.update( insertQuery, new Object[] { audit.getRemoteHost(), audit.getRequestURL(), audit.getSendDate(), audit.getHost(), audit.getUserId(), audit.getSuccess(), audit.getErrorMessage(), audit.getTransactionId(), audit.getTransactionType(), audit.getRequestBody(), audit.getResponseHeader(), audit.getResponseBody() }); } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }
XMLUploadBusinessProcessImpl Class: This is the class used for POST request of xml data to an URL.
package com.abc.xyz.businessprocess; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthenticationException; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.InputStreamEntity; import org.apache.http.impl.auth.BasicScheme; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.log4j.Logger; import org.springframework.transaction.annotation.Transactional; import com.abc.xyz.WebServiceUploadConfig; import com.abc.xyz.XMLConverter; import com.abc.xyz.dao.WebServiceUploadAuditDAO; import com.abc.xyz.exception.WebServiceUploadException; import com.abc.xyz.model.dataobjects.WebServiceUploadAudit; import com.abc.xyz.xml.model.TransactionXMLData; public class XMLUploadBusinessProcessImpl implements XMLUploadBusinessProcess { private XMLConverter xmlConverter; private WebServiceUploadAuditDAO webServiceUploadAuditDAO; Logger logger = Logger.getLogger(XMLUploadBusinessProcessImpl.class); public void processTransactionXMLObjectForUpload( WebServiceUploadConfig webServiceUploadConfig, TransactionXMLData transactionXMLData) throws WebServiceUploadException { if (webServiceUploadConfig == null) throw new IllegalArgumentException("WebServiceUploadConfig is null"); WebServiceUploadAudit audit = new WebServiceUploadAudit(); HttpClient client = HttpClientBuilder.create().build(); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlConverter.convertFromObjectToOutPutStream(transactionXMLData, baos); HttpPost post = new HttpPost(webServiceUploadConfig.getUrl()); if (!StringUtils.isEmpty(webServiceUploadConfig.getUsername())) { post.addHeader(new BasicScheme().authenticate( new UsernamePasswordCredentials(webServiceUploadConfig .getUsername(), webServiceUploadConfig .getPassword()), null, null)); } InputStreamEntity reqEntity = new InputStreamEntity( new ByteArrayInputStream(baos.toByteArray()), -1); post.addHeader("Content-Type", "application/xml"); post.setEntity(reqEntity); String host = "hostname"; audit.setHost(host); audit.setSuccess(true); audit.setRequestURL(webServiceUploadConfig.getUrl()); audit.setUserId(webServiceUploadConfig.getUsername()); audit.setRequestBody(baos.toString()); audit.setSendDate(new Date()); audit.setTransactionId(transactionXMLData.getTransactionIdValue()); audit.setTransactionType(transactionXMLData .getTransactionTypeValue()); HttpResponse response = client.execute(post); // convert header to string StringBuilder sb = new StringBuilder(); sb.append("HTTP Response Status: "); sb.append(response.getStatusLine().toString()); // attach new line sb.append("\n"); Header[] headers = response.getAllHeaders(); for (int i = 0; i < headers.length; i++) { sb.append(headers[i].getName()); sb.append(":"); sb.append(headers[i].getValue()); // attach new line sb.append("\n"); } audit.setResponseHeader(sb.toString()); ByteArrayOutputStream responseBaos = new ByteArrayOutputStream(); response.getEntity().writeTo(responseBaos); audit.setResponseBody(responseBaos.toString()); if (logger.isInfoEnabled()) { logger.info("response" + response.getEntity().getContent() + "-" + response.getStatusLine()); } if (response.getStatusLine().getStatusCode() != 200) { audit.setSuccess(false); audit.setErrorMessage("Status code is not success: " + response.getStatusLine()); throw new WebServiceUploadException(response.getStatusLine() .toString()); } } catch (Throwable t) { logger.warn("Error response", t); audit.setSuccess(false); audit.setErrorMessage(t.getMessage()); throw new WebServiceUploadException(t); } finally { webServiceUploadAuditDAO.save(audit); } }
So with the above approach, we can send XML data to an external URL (i.e Web service URL)
throgh http POST request.