axis1
import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class Axis1ClientUitl {
public static Object callService(String url,Class type,String method,Object[] args){
Call call = initCall(url, method);
//执行方法并带上参数
Object result=null;
try {
result = call.invoke(args);
} catch (RemoteException e) {
e.printStackTrace();
}
return result;
}
private static Call initCall(String url, String method) {
Service service = new Service();
Call call = null;
try {
call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(url));
call.setOperationName(new javax.xml.namespace.QName("urn:sap-com:document:sap:soap:functions:mc-style", method));
call.setReturnClass(org.w3c.dom.Element.class);
call.addParameter("op1", XMLType.XSD_STRING, ParameterMode.IN);
} catch (Exception e) {
e.printStackTrace();
}
return call;
}
}
AXIS2
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Axis2ClientUtil {
/**
* 初始化调用客户端
* @return
*/
private static RPCServiceClient initServiceClient(String serviceURL){
// 使用RPC方式调用WebService
RPCServiceClient serviceClient;
try {
serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(serviceURL);
options.setTo(targetEPR);
return serviceClient;
} catch (AxisFault e) {
e.printStackTrace();
}
return null;
}
/**
* 调用service
* @return
*/
public static Object[] callService(String serviceURL,Class type,String methodName,String args){
try {
RPCServiceClient service2Client = initServiceClient(serviceURL);
// 指定methodName方法的参数值
Object[] opAddEntryArgs = new Object[] {args};
// 指定methodName方法返回值的数据类型的Class对象
Class[] classes = new Class[] {type};
// 指定要调用的methodName方法及WSDL文件的命名空间
QName opAddEntry = new QName("urn:sap-com:document:sap:soap:functions:mc-style", methodName);
return service2Client.invokeBlocking(opAddEntry, opAddEntryArgs,classes);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
JAVA.NET URL方式调用
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 java.util.ArrayList;
import java.util.List;
public class UrlCallServiceUtil {
/**
*
* @param strURL 要调用的url地址
* @param strCharse 设置字符编码方式,为null,设置为utf8
* @return
* @throws Exception
*/
public static String postRequest(String strURL, String strCharset)
throws Exception {
if ((strURL == null) || (strURL.length() == 0))
return null;
if ((strCharset == null) || (strCharset.length() == 0)) {
strCharset = "UTF-8";
}
String[] arrContent = (String[]) null;
if (strURL.indexOf("?") > -1) {
arrContent = string2Array(strURL.substring(strURL.indexOf("?") + 1), '&', false);
strURL = strURL.substring(0, strURL.indexOf("?"));
}
StringBuffer sb = new StringBuffer();
HttpURLConnection con = null;
try {
URL url = new URL(strURL);
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setInstanceFollowRedirects(true);
con.setRequestMethod("POST");
con.addRequestProperty("Content-type","application/x-www-form-urlencoded");
con.setUseCaches(false);
con.connect();
if ((arrContent != null) && (arrContent.length > 0)) {
StringBuffer sbContent = new StringBuffer();
for (int i = 0; i < arrContent.length; i++) {
if ((arrContent[i] == null) || (arrContent[i].indexOf("=") == -1))
continue;
sbContent.append(arrContent[i].substring(0, arrContent[i].indexOf("="))).append("=");
sbContent.append(URLEncoder.encode(arrContent[i].substring(arrContent[i].indexOf("=") + 1),strCharset)).append("&");
}
DataOutputStream out = new DataOutputStream(con.getOutputStream());
out.writeBytes(sbContent.toString());
out.flush();
out.close();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), strCharset));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
con.disconnect();
return sb.toString();
} catch (Exception e) {
System.out.print(e.getMessage());
sb.append(e.getMessage());
String str1 = sb.toString();
return str1;
} finally {
if (con != null)
con = null;
}
}
public static String[] string2Array(String s, char delim, boolean trim) {
if (s.length() == 0)
return new String[] {};
List<String> a = new ArrayList<String>();
char c;
int start = 0, end = 0, len = s.length();
for (; end < len; ++end) {
c = s.charAt(end);
if (c == delim) {
String p = s.substring(start, end);
a.add(trim ? p.trim() : p);
start = end + 1;
}
}
String p = s.substring(start, end);
a.add(trim ? p.trim() : p);
return (String[]) a.toArray(new String[a.size()]);
}
}
最后一种,也是最笨的一种-----最原始(因为webservice能够跨语言是因为它在网络上请求,回应的数据结构是固定的或者说是标准)
TIPS:所有的语言封装的webservice,其底层都是传输的相同的xml文件
所以我们也可以自己手动拼接SOAP XML然后用url发送代码如下
SoapTap类
import java.util.List;
/**
* soap标签
* @author Administrator
*
*/
public class SoapTag {
private String tagName;//标签名称
private String tagValue;//标签值
private String tagAttr;//标签属性
private List<SoapTag> children;//子标签
private SoapTag parent;//父类标签
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public String getTagValue() {
return tagValue;
}
public void setTagValue(String tagValue) {
this.tagValue = tagValue;
}
public List<SoapTag> getChildren() {
return children;
}
public void setChildren(List<SoapTag> children) {
this.children = children;
}
public SoapTag getParent() {
return parent;
}
public void setParent(SoapTag parent) {
this.parent = parent;
}
public String getTagAttr() {
return tagAttr;
}
public void setTagAttr(String tagAttr) {
this.tagAttr = tagAttr;
}
/**
* 转化为soapxml
* @return
*/
public String toSoapStr(StringBuilder retSoap){
retSoap.append(createTagL());
List<SoapTag> kids = getChildren();//拿到子节点
if(kids != null&&kids.size()>0){
for(SoapTag tag:kids){
tag.toSoapStr(retSoap);
}
}
retSoap.append(createTagR());
return retSoap.toString();
}
/**
* 生成单个tag标签左边
* @param name
* @param value
* @return
*/
private String createTagL(){
return "<"+getTagName()+">";
}
/**
* 生成单个tag标签右边
* @param name
* @param value
* @return
*/
private String createTagR(){
return "</"+getTagName()+">";
}
}
工具类(项目中有特殊情况的逻辑,自己改吧改吧)
import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SoapHttpUtil {
private static Logger log = Logger.getLogger(SoapHttpUtil.class);
private static Map<String,String> tagMap = new LinkedHashMap<String, String>();
static{
tagMap.put("Strcustid", null);
tagMap.put("TActivities", "CustId,ActiId,ActiType,ActiCodeNm,TitleNm,StartDt,EndDt,ActiStatus,ActiContent,MangerNms,CusPartis,InformantNm,ReportDt,Attachement");
tagMap.put("TContact", "CustId,Name,Sex,DepNm,Post,Email,FixTel,Mobile,IsMainContact");
tagMap.put("TIbs", "CustId,IbsId,Name,RelationType,RelationName,DepNm,Email,FixTel,Mobile,IsMainIbs");
tagMap.put("TabCondition", "ConField,ConHigh,ConLow,ConOption,ConSign");
}
/**
* 调用机构CRM用户新增接口
* @param serviceURL endpoint
* @param paramMap
* @return
*/
public static String callService(String serviceURL,String custid){
// 生成XML
String soapBody = getSoapBody("ZcsGetcustinfoforcrm","urn:sap-com:document:sap:soap:functions:mc-style",custid);
// 发送soap1.1请求
Map<String,String> retSoap = doSoapPostRequest(serviceURL, soapBody, "utf-8");
// 解析结果并返回
StringBuilder retBuilder = new StringBuilder();
return parseResponse(retSoap.get("RESULT"));
}
/**
* 根据参数生成soap发送的xml
* @param paramMap
* @return
*/
public static String getSoapBody(String actionurn,String namespace,String custids) {
StringBuilder sb = new StringBuilder();
sb.append("<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' ");
sb.append(" xmlns:urn='"+namespace+"'>\n");
sb.append(" <soapenv:Header/>\n");
sb.append(" <soapenv:Body>\n");
sb.append(" <urn:"+actionurn+">\n");
createSopTag(sb,tagMap,custids);//调用内部类
sb.append(" </urn:"+actionurn+">\n");
sb.append(" </soapenv:Body>\n");
sb.append("</soapenv:Envelope>");
return sb.toString();
}
/**
* 子类tag
*/
private static void createSopTag(StringBuilder ret,Map<String,String> _tagMap,String param){
for(Entry<String, String> entry:_tagMap.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
if(value == null){
ret.append("<"+key+">" + param+"</"+key+">");
}else{
String values[] = value.split(",");//
List<SoapTag> kid = new ArrayList<SoapTag>();
List<SoapTag> itemKid = new ArrayList<SoapTag>();
SoapTag parent = new SoapTag();
parent.setTagName(key);
parent.setTagValue("");
SoapTag itemTag = new SoapTag();//itemTag
itemTag.setTagName("item");
kid.add(itemTag);
for(String kidTag:values){
SoapTag kidtag = new SoapTag();
kidtag.setTagName(kidTag);
kidtag.setTagValue("");
itemKid.add(kidtag);
}
itemTag.setChildren(itemKid);
parent.setChildren(kid);
parent.toSoapStr(ret);//转化为tagxml
}
}
}
/**
* 解析结果
* @param respStr
* @return
*/
public static String parseResponse(String respStr){
StringBuilder active = new StringBuilder();//活动服务
StringBuilder ourcust = new StringBuilder();//我方联系人
StringBuilder cust = new StringBuilder();//客户方联系人
Map<String, String> map = new HashMap<String, String>();
Document soupdoc = null;
try {
soupdoc = Jsoup.parse(respStr);
} catch (Exception e) {
log.error("接口返回结果无法解析", e);
throw new RuntimeException("接口返回结果无法解析", e);
}
Elements activities = soupdoc.select("TActivities");//活动服务记录
Elements contact = soupdoc.select("TContact");//客户方联系人
Elements ibs = soupdoc.select("TIbs");//我方跟踪团队
parseEles(active,activities.get(0).children());
parseEles(cust,contact.get(0).children());
parseEles(ourcust,ibs.get(0).children());
String activsJson = finalJson("active",active);
String custjson = finalJson("cust",cust);
String ourcustjson = finalJson("ourcust",ourcust);
return "{" + activsJson +","+custjson+","+ourcustjson+"}";
}
/**
* @return
*/
private static String finalJson(String name ,StringBuilder json){
String _name = toJsonStyle(name);
String items = json.substring(0,json.lastIndexOf(","));
return ""+_name+":["+items+"]";
}
/**
* item节点
* @param retBuilder
* @param els
* @return
*/
private static String parseEles(StringBuilder retBuilder,Elements els){
for(int i = 0 ;i < els.size();i++){
Element e = els.get(i);
parseChildren(retBuilder,e.children());
}
return null;
}
/**
* 解析子节点
* @return
*/
private static String parseChildren(StringBuilder retBuilder,Elements els){
StringBuilder tempBuilder = new StringBuilder();
tempBuilder.append("{");
for(int i = 0 ;i < els.size();i++){
Element e = els.get(i);
String jitem = toJson(e);
tempBuilder.append(jitem+",");
}
String temp = tempBuilder.substring(0, tempBuilder.lastIndexOf(","));
retBuilder.append(temp + "},");
return retBuilder.toString();
}
/**
* 转换为json对象
* @return
*/
private static String toJson(Element e){
String name = e.tagName().toUpperCase();
String value = e.text();
return toJsonStyle(name) + ":" + toJsonStyle(value);
}
/**
* 转换为json格式加双引号
* @return
*/
public static String toJsonStyle(String value){
return "\""+value+"\"";
}
/**
* Post提交
* @param urlstr
* @param body
* @return
*/
public static Map<String, String> doSoapPostRequest(String urlstr, String body, String charset) {
Map<String, String> reMap = new HashMap<String, String>();
int resCode = -1; //返回状态值
String resMsg = ""; //返回信息
HttpURLConnection httpConn = null;
OutputStream out = null;
BufferedReader bfw = null;
String line = null;
StringBuffer sb = new StringBuffer();
try {
URL url = new URL(urlstr);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setRequestMethod("POST");
if (charset == null) {
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
}else {
httpConn.setRequestProperty("Content-Type", "text/xml; charset=" + charset);
httpConn.setRequestProperty("SOAPAction", urlstr);
}
httpConn.setUseCaches(false);
httpConn.setInstanceFollowRedirects(false);
httpConn.setConnectTimeout(5000);
httpConn.setReadTimeout(10000);
httpConn.setDoInput(true);
httpConn.setDoOutput(true);
out = httpConn.getOutputStream();
out.write(body.getBytes("UTF-8"));
out.flush();
} catch (MalformedURLException e) {
log.error("请求异常", e);
throw new RuntimeException("请求异常", e);
} catch (ProtocolException e) {
log.error("请求异常", e);
throw new RuntimeException("请求异常", e);
} catch (IOException e) {
log.error("请求异常", e);
throw new RuntimeException("请求异常", e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 结果处理
try {
// 获取返回值
resCode = httpConn.getResponseCode();
resMsg = httpConn.getResponseMessage();
if (resCode == 200) {
bfw = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "utf-8"));
while ((line = bfw.readLine()) != null) {
String curLine = line.trim();
if (!isEmpty(curLine)) sb.append(curLine);
}
reMap.put("CODE", "1");
reMap.put("RESULT", sb.toString());
} else {
reMap.put("CODE","-1");
reMap.put("RESULT","code=" + resCode+",msg=" + resMsg);
}
} catch (IOException e) {
log.error("返回结果读取异常", e);
throw new RuntimeException("返回结果读取异常", e);
} finally {
if (bfw != null) {
try {
bfw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return reMap;
}
/**
* 判断字符串是否为空
* @param src
* @return
*/
public static boolean isEmpty(String src) {
return src == null || src.trim().length() <= 0;
}
public static void main(String[] args) throws Exception{
SoapHttpUtil ws = new SoapHttpUtil();
String serviceURL = "test.do";
String ret = ws.callService(serviceURL, "1000004106");
System.out.println(ret);
}
}