天天看點

cxf用戶端調用webservice接口,伺服器端重新開機後調用失敗,改為Restful方式調用

之前用cxf用戶端調用soap協定的webservice接口,發現一個問題:

如果服務端需要重新開機,在重新開機期間(服務未成功啟動之前),cxf用戶端調用了服務,傳回失敗結果(因為服務端未啟動),等服務端重新開機 後,cxf用戶端調用服務一直失敗,隻有cxf用戶端重新開機後方可繼續使用。

是以調用方式改為restful方式,post方式調用,接收傳回的xml檔案,服務端的重新開機就不會影響到用戶端了 。

之前cxf用戶端調用方式:

public static String sendfxBackEnd(String methodName,String json, String prokey) {
		String rs = "";
		try {
			// 這個是用cxf 用戶端通路cxf部署的webservice服務
			// 千萬記住,通路cxf的webservice必須加上namespace ,否則通不過
			// 現在又另外一個問題,傳遞過去的參數服務端接收不到
			logger.info("發送WS->sendBackEnd請求:" + rs);
			JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory
					.newInstance();
			Client client = dcf
					.createClient(ConfigUtil.getProperty("config.properties", prokey));

			// url為調用webService的wsdl位址
			QName qname = new QName(ConfigUtil.getProperty("config.properties", prokey+"Ns"),
					methodName);

			String strXml = "";
			// paramvalue為參數值
			logger.info("發送WS請求:sendfxBackEnd=" + json);
			Object[] result = client.invoke(qname, json);
			// 調用web Service//輸出調用結果
			rs = result[0].toString();
			logger.info("接收WS應答:" + rs);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
             return rs;		
	}
           

restful調用方式:

package com.market.common.protocol;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class RestfulClientUtils {
	
	/**
	 * 參考示例
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		String url = "http://127.0.0.1:8800/axis2/services/fx.adapter/crm";
		String param = "{\"op\":\"cashorder\", \"aid\":\"3000566\"}";
		String ret = call(url, param);
		System.out.println("ret: " + ret);
	}
	
	public static String call(String urlPath, String param) throws Exception {
		StringBuffer sb = new StringBuffer();
		// 建立連接配接
		URL url = new URL(urlPath);
		// 如有中文一定要加上,在接收方用相應字元轉碼即可
		param = "args0=" + URLEncoder.encode(param, "utf-8");		// 參數
		
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 設定參數
		conn.setDoOutput(true); // 需要輸出
		conn.setDoInput(true); // 需要輸入
		conn.setUseCaches(false); // 不允許緩存
		conn.setConnectTimeout(10000);	// 
		conn.setReadTimeout(10000);
		conn.setRequestMethod("POST"); // 設定POST方式連接配接
		// 設定請求屬性
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		conn.setRequestProperty("Connection", "Keep-Alive");// 維持長連接配接
		conn.setRequestProperty("Charset", "UTF-8");
		// 連接配接,也可以不用明文connect,使用下面的httpConn.getOutputStream()會自動connect
		conn.connect();
		// 建立輸入流,向指向的URL傳入參數
		DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
		dos.writeBytes(param);
		dos.flush();
		dos.close();
		// 獲得響應狀态
		int resultCode = conn.getResponseCode();
		if (HttpURLConnection.HTTP_OK == resultCode) {
			String readLine = new String();
			BufferedReader responseReader = new BufferedReader(
					new InputStreamReader(conn.getInputStream(), "UTF-8"));
			while ((readLine = responseReader.readLine()) != null) {
				sb.append(readLine).append("\n");
			}
			responseReader.close();
			return parseXmlStr(sb.toString());
		}
		return null;
	}
	
	
	/**
	 *  解析xml字元串,提取傳回内容
	 * @param xmlStr
	 * @return
	 */
	public static String parseXmlStr(String xmlStr) {
		String ret = null;
		Document doc = null;
		try {
			doc = DocumentHelper.parseText(xmlStr); //将字元串轉為XML
			Element root = doc.getRootElement(); // 擷取根節點
			ret = root.elementTextTrim("return"); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}
}
           

繼續閱讀