之前用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;
}
}