webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,一般都有三种方式
1,直接AXIS调用远程的web service
2,直接SOAP调用远程的webservice
3,使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用。
这些方法介绍文章很多,要么不全,要么比较麻烦,介绍一个其他的方式,也是我一直使用的,挺方便的。
一,引包,主要的就是这个,其他的框架相关的大家肯定有的。
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
二、代码,注意getXML要根据querymap对应修改一下
package com.cm.common.utils;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class WebServicesUtils {
public static void main(String[] args) {
getResult("2020-11-11 07:00:00","2020-11-11 20:00:00");
}
@ResponseBody
public static String getResult(
@RequestParam(value = "PlanEndDateStart",defaultValue = "") String PlanEndDateStart,
@RequestParam(value = "PlanEndDateEnd",defaultValue = "")String PlanEndDateEnd
){
Date start=new Date();
JSONObject object = new JSONObject();
try {
//第一步:创建服务地址
URL url = new URL("http://需要调用的地址/TransService.asmx?wsdl");
//第二步:打开一个通向服务地址的连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//第三步:设置参数
//3.1发送方式设置:POST必须大写
connection.setRequestMethod("POST");
//3.2设置数据格式:content-type
connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
//3.3设置输入输出,因为默认新创建的connection没有读写权限,
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
//封装请求参数
Map querymap = new HashMap();
//querymap.put("PlanEndDateStart",PlanEndDateStart);//完成日期-起始-必填-按计划结束日期来查
querymap.put("PlanEndDateStart","2020-11-11 07:00:00");//完成日期-起始-必填-按计划结束日期来查
//querymap.put("PlanEndDateEnd",PlanEndDateEnd);//完成日期-结束-必填-按计划结束日期来查
querymap.put("PlanEndDateEnd","2020-11-11 20:00:00");//完成日期-结束-必填-按计划结束日期来查
querymap.put("Factory","100");//工厂-必填
querymap.put("DefID","LSJ4088");//物料号
querymap.put("SAPOrderID","008077546");//生产订单
querymap.put("TeamName","02");//班组=username
//第四步:组织SOAP数据,发送请求
String soapXML = getXML(querymap);
//将信息以流的方式发送出去
//POST请求
PrintWriter out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));
out.println(soapXML);
out.flush();
out.close();
//第五步:接收服务端响应,打印
int responseCode = connection.getResponseCode();
if(200 == responseCode){//表示服务端响应成功
//获取当前连接请求返回的数据流
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
String lines;
StringBuffer sb = new StringBuffer("");
while ((lines = reader.readLine()) != null) {
sb.append(lines);
}
reader.close();
//System.out.println(sb.toString());
//处理获取数据(xml格式字符串)
// 下面的是通过解析xml字符串的
Document doc = DocumentHelper.parseText(sb.toString()); // 将字符串转为XML
Element rootElt = doc.getRootElement(); // 获取根节点
//System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
Iterator iter = rootElt.elementIterator("Body"); // 获取根节点下的子节点Body
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date end=new Date();
long diff = end.getTime() - start.getTime();
System.out.println("2.获取mes数据的时间:"+sdf.format(new Date())+",并且获取mes数据用了:"+diff+"毫秒");//打印刚刚进入方法的时间
// 遍历head节点
while (iter.hasNext()) {
Element recordEle = (Element) iter.next();
Iterator getOrderInfosByTimeResponse = recordEle.elementIterator("getOrderInfosByTimeResponse"); // 获取子节点Body下的子节点getOrderInfosByTimeResponse
while (getOrderInfosByTimeResponse.hasNext()) {
Element info = (Element) getOrderInfosByTimeResponse.next();
Iterator result = info.elementIterator("getOrderInfosByTimeResult"); // 获取子节点getOrderInfosByTimeResult下的子
while (result.hasNext()) {
Element itemEle = (Element) result.next();
String code = itemEle.elementTextTrim("code"); // 拿到head下的子节点getOrderInfosByTimeResult下的字节点code的值
if("1".equals(code)){//成功返回数据
object.put("recode",1);
String data = itemEle.elementTextTrim("data");
System.out.println(data);
//解析得到的jsonArray字符串
//根据拿到的数据做自己想做的事情
}else if("6".equals(code)){//失败获取error提示信息
object.put("recode",2);
String error = itemEle.elementTextTrim("error");
object.put("error",error);
}
}
}
}
}else{
object.put("recode",2);
object.put("error","请求MesService失败");
}
// 断开连接
connection.disconnect();
} catch (Exception e){
e.printStackTrace();
object.put("recode",3);
object.put("error","系统后台错误");
}
return object.toJSONString();
}
/**
* 携带参数访问WebService接口
*/
public static String getXML(Map querymap){
String soapXML = ""
+"
+"xmlns:web=\"http://tempuri.org/\" "
+"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" "
+"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+""
+""
+""
+""
+querymap.get("PlanEndDateStart")
+""
+""
+querymap.get("PlanEndDateEnd")
+""
+""
+querymap.get("Factory")
+""
+""
+querymap.get("DefID")
+""
+""
+querymap.get("SAPOrderID")
+""
+""
+querymap.get("TeamName")
+""
+""
+""
+""
+" ";
return soapXML;
}
}