Hi all,

I am trying to POST an XML to php based Web Service via HTTP POST method. The php form of the target system is something like this :

PHP Code:

    $xmlstring  = '<?xml version="1.0" ?>';
    $xmlstring .= '<data>';
    $xmlstring .= '<ordernum>1234567890123</ordernum>';
    $xmlstring .= '<custname>RUSDY AB. AZIZ</custname>';
    $xmlstring .= '<mobilenum>0136130702</mobilenum>';
    $xmlstring .= '<orderstatus>OnHold</orderstatus>';
    $xmlstring .= '<prodtype>STX</prodtype>';
    $xmlstring .= '</data>';


<form name="icp2swans" method="POST" action="http://n9.intra.tm/swans/openapi/icpwaiters.php">
<!--- <form name="icp2swans" method="POST" action="icpwaiters.php"> --->
	<!--- <input type="hidden" name="secretkey" value="ef6bf191c37ff1a78633dca0434ef147"> --->
	<p>XML Text :</p> <!--- <input type="text" name="ordernum" value="123456789012345" size="15"><br> --->
    <textarea name="xmldata" rows="10" cols="100"><?php echo $xmlstring; ?></textarea>
	<p><input type="submit" value="Submit"></p>

My java code is that doe the POST action is something like this:
Java Code:
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.accenture.eai.arch.DataModel.DataPipe;
import com.accenture.eai.arch.DataModel.FlowControlData;
import com.tm.hsbb.eai.archcomp.common.constant.HSBBConstant;
import com.tm.hsbb.eai.archcomp.common.constant.HSBBErrorCode;
import com.tm.hsbb.eai.archcomp.exception.ApplicationRuntimeException;
import com.tm.hsbb.eai.archcomp.exception.InternalErrorRuntimeException;
import com.tm.hsbb.eai.archcomp.transformer.CdmTransformer;
import com.tm.hsbb.eai.common.util.StringUtil;
import com.tm.hsbb.eai.commonservices.audit.HSBBAuditLogger;

 * Supports following HTTP features:
 * - Authentication (AuthScope not well implemented though)
 * - timeout
 * @author 
public class HttpMessageSender implements MessageSender {

	static final Logger logger = Logger.getLogger(HttpMessageSender.class);
	static Logger perfLogger = Logger.getLogger("EAIPerformanceLogger."+HttpMessageSender.class);
	private HSBBAuditLogger hsbbAuditLogger;

	private CdmTransformer cdmTransformer;
	private String webServerUrl;	// Mandatory field
	private String contentType;		// Optional field
	private String username;		// Optional field
	private String password;		// Optional field
	protected String timeOutInMS = "300000";		// Optional field
	private Map<String, String> requestHeaders;	// Optional field
//	private static MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();

	public void setRequestHeaders(Map<String, String> requestHeaders) {
		this.requestHeaders = requestHeaders;

	 * Authentication Schemes supported
	 * - Basic
	 * - Digest
	 * - NTLM (not tested yet!)
	public String send(String inputMsg) {
		String whatIstheInputMSG = inputMsg;
		logger.info("Executing HttpMessageSender.send()");
		logger.debug("HTTP Message Body: " + inputMsg);
		logger.debug("Sending to URL: " + webServerUrl);
		perfLogger.debug("[Enter send()] " + ((perfLogger.isDebugEnabled())?("["+Runtime.getRuntime().freeMemory()+"]"):""));
//		HttpClient client = new HttpClient(connectionManager);
		HttpClient client = new HttpClient();
		// Setting the default HTTP POST content type
		if (StringUtil.isNullOrBlank(contentType)) {
			 contentType = "text/xml; charset=UTF-8";
		// Create HTTP post object
		PostMethod post = new PostMethod(webServerUrl);
		// Set HTTP Request Headers (if available)
		if(requestHeaders!= null)
			Set<String> reqHeadersKeySet = (Set<String>)requestHeaders.keySet();
			for(String reqHeadersKey : reqHeadersKeySet) {
				post.setRequestHeader(reqHeadersKey, requestHeaders.get(reqHeadersKey));
		// Request body content will be retrieved directly from the inputMsg  
		RequestEntity entity = new InputStreamRequestEntity(IOUtils.toInputStream(inputMsg), contentType);
		// Set timeout parameter (if available)
		// Assumption: value is a valid positive number if set 
		if (!StringUtil.isNullOrBlank(timeOutInMS)) {
			client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, new Integer( timeOutInMS ));
		// Set authentication information (if available)
		if (!StringUtil.isNullOrBlank(username)) {
	        // Pass the credentials to HttpClient. 
			// AuthScope.ANY means that we will send this login credential to any host/url we define (not recommended).
	        client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));	          	          
		// Execute request
		try {
			int statusCode = client.executeMethod(post);
			if (statusCode != HttpStatus.SC_OK) 
				logger.debug("Method failed: " + post.getStatusLine());
				throw new InternalErrorRuntimeException("Error while doing HTTP Post with reason: " + post.getStatusLine() + ". and error message is:" + post.getResponseBodyAsString());				
			String httpResponse = post.getResponseBodyAsString();

			logger.debug("HTTP Response Status Code: " + statusCode);
			logger.debug("HTTP Response Body: " + httpResponse);
			perfLogger.debug("[Exit send()] " + ((perfLogger.isDebugEnabled())?("["+Runtime.getRuntime().freeMemory()+"]"):""));
			return httpResponse;

		} catch (Exception e) {
			logger.error("Exception occured while sending HTTP POST request to " + webServerUrl , e);
			throw new ApplicationRuntimeException("post to:"+ webServerUrl + " error! "+e.getMessage(), e, HSBBErrorCode.MESSAGE_INTO_TARGET_HTTP_FAILED, inputMsg);
		} finally {
			// Release current connection to the connection pool

	protected void handlePostReturn(PostMethod post) 
		// TODO Auto-generated method stub
		// This is to be overriden
	public DataPipe sendWithCdmControlData(DataPipe dataPipe) {
		String messageBodyToSend = (String)dataPipe.get(FlowControlData.Data);
		String beName = (String)dataPipe.get(FlowControlData.EventName);
		String intgMesgId = (String)dataPipe.get(FlowControlData.IntegrationId);
		this.hsbbAuditLogger.auditLog(HSBBConstant.AUDIT_TYPE_HTTP_REQUEST, messageBodyToSend, beName, intgMesgId, null);		
		String httpResponse = send(messageBodyToSend);
		this.hsbbAuditLogger.auditLog(HSBBConstant.AUDIT_TYPE_HTTP_RESPONSE, httpResponse, beName, intgMesgId, null);
		dataPipe.put(FlowControlData.Data, httpResponse);
		return dataPipe;
	public void setCdmTransformer(CdmTransformer cdmTransformer) {
		this.cdmTransformer = cdmTransformer;

	public void setWebServerUrl(String webServerUrl) {
		this.webServerUrl = webServerUrl;

	public void setContentType(String contentType) {
		this.contentType = contentType;

	public void setUsername(String username) {
		this.username = username;

	public void setPassword(String password) {
		this.password = password;

	public void setTimeOutInMS(String timeOutInMS) {
		this.timeOutInMS = timeOutInMS;

	public String getWebServerUrl() {
		return webServerUrl;

	public String getTimeOutInMS() {
		return timeOutInMS;

The XML that is to be sent is :

<?xml version="1.0" encoding="utf-8" standalone="no"?>

The problem is that the programme does send the XML to the target system, however the target is returning a result that is indicates an error;

<?xml version="1.0" ?>
<errormsg>XML text was Empty. Sorry, you have submitted an empty form</errormsg>

According to the administrator of the target system, the error is due to the fact that the something in my HTTP message(the envelope must I presume) must conform to the name attribute of the textarea element in his php form. He even gave me a fragment of his code:

Java Code:
if( isset($_POST['xmldata']) && !empty($_POST['xmldata']) )
  // proceed
  // return error (is empty)
Input name: “xmldata”

This is the first time I am working with a code that requires me to interface with a php based system. I don't even know what I assumed above is correct. Please help. Thank you all in advance.