1、适应范围
拿到对接公司的一个接口,是用.net编写的webservice接口(.asmx),接口方会给到接口地址、方法名、参数及对方那边的返回值类型、测试数据。如果没有一下这些,那么就可以向客户那边索取。例(我这边接口方提供的数据):
2、拿到地址后访问,点击网址查看是否可以访问,并找到对应的方法(以下蓝色字体就是方法名:He'l'loWorld、QzjSaveEvent...)
能直接访问代表接口是通的(没有类似这样的页面,联系接口方更改),
链接后加?wsdl可查看:
http:// ip(调用时更改) /WebServiceCode/EventAddService.asmx?wsdl
3、编写代码
① 添加maven文件依赖(以下涉及到测试会用到的代码,宁愿多写,不少写)
javax.activation
activation
1.1.1
org.apache.axis
axis
1.4
axis
axis-jaxrpc
1.4
commons-discovery
commons-discovery
0.5
wsdl4j
wsdl4j
1.6.3
commons-beanutils
commons-beanutils
1.9.3
org.json
json
20190722
commons-io
commons-io
2.4
commons-httpclient
commons-httpclient
3.1
javax.mail
mail
1.4.7
② java代码编写
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class SoapWebService {
public static void main(String[] args){
// webService链接地址
String url = "https://mfg-apac.johnsoncontrols.cn/WX_MES40_API/SmartMES_API_JCAC_Ext.asmx";
// server域名地址,为了统一规范,一般都是这个域名
String soapaction = "http://tempuri.org/";
// 方法名
String methodName = "Return_DT_Json";
// 用户提供测试的两个参数
String DataSource = "PRM_JCI_Operation_Impeller";
String Scope = ""; // 以接口方提供测试数据为准,我这里为""是接口方要求
Service service = new Service();
try{
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
// 设置要调用哪个方法
call.setOperationName(new QName(soapaction,methodName));
// 设置要传递的参数名
call.addParameter(new QName(soapaction,"DataSource"),org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.addParameter(new QName(soapaction,"Scope"),org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 提供标准类型
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapaction + methodName);
// 调用方法并传递参数
String ref = (String)call.invoke(new Object[]{DataSource,Scope});
System.out.println(ref);
}catch (Exception e){
e.printStackTrace();
}
}
}
4、运行main方法,获取如下数据
5、成功。
如果需要给前端提供接口源码的朋友,可以给我留言,看到会及时回复。以上只是测试数据
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下是使用springboot开发(环境我就不介绍了,不会的看我博客中springboot环境搭建教程)
1、Controller层(为了以防你们不知道在哪个包下,我也把包放上去)
import com.example.demo.pojo.ResultMap;
import com.example.demo.service.SoapService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController // 自动将接口返回值转成json形式,不用在方法上写@ResponseBody注解,代表全局
@RequestMapping("/select")
public class SoapWebServiceConnect {
/**
* @url https://mfg-apac.johnsoncontrols.cn/WX_MES40_API/SmartMES_API_JCAC_Ext.asmx
* @method Return_DT_Data
* @param DataSource
* @param Scope
*/
@Autowired
private SoapService soapService;
@RequestMapping("/soap")
public ResultMap selectSoap(){
// DataSource(表名) Scope(筛选条件)
Map result = soapService.selectSoap();
// 将结果存放到ResultMap中,返回成功标志
ResultMap resultMap = new ResultMap("OK","success",result);
return resultMap;
}
}
2、Service层
import com.example.demo.dao.SoapDao;
import com.example.demo.pojo.DataScope;
import org.apache.axis.client.Call;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SoapService {
@Autowired
private SoapDao soapDao;
public static final String URL = "https://mfg-apac.johnsoncontrols.cn/WX_MES40_API/SmartMES_API_JCAC_Ext.asmx";
public Map selectSoap(){
Map map = new HashMap<>();
String ref = "";
List dataScopes = soapDao.findAll();
for (int i = 0;i
3、Dao层
import com.example.demo.pojo.DataScope;
import org.springframework.data.jpa.repository.JpaRepository;
// DataScope是实体类,Integer是Id类型
public interface SoapDao extends JpaRepository {
}
4、实体类(调用webService是客户那边写好的接口,这个实体类只是客户提供给我们的参数,DataSource,Scope),为什么要给数据库定义呢?那是因为,客户那边DataSource对应的数据有17条,Scope也是17条。那么我如果在代码里写死直接将值向客户那边传,相当于要调用17次。不灵活,且不易维护,所以写到数据库,只需查询一次,然后将数据遍历出来,放到map中以json形式返回给前端进行处理即可。最重要的一点是,不用传多次,传遍历出来的数据只需在循环中调用一次即可
实体类1(与数据库对应关系)
import javax.persistence.*;
@Table(name="datascope")
@Entity
public class DataScope {
@Id
@GeneratedValue // 默认AUTO 自增长
private Integer id;
@Basic // 与数据库映射关系
@Column(name="datasource",nullable = false)
private String datasource;
@Basic // 与数据库映射关系
@Column(name="scope",nullable = false)
private String scope;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDatasource() {
return datasource;
}
public void setDatasource(String datasource) {
this.datasource = datasource;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}
实体类2(Map封装并返回状态码)
import java.util.Map;
public class ResultMap {
// 状态码
private String status;
// 返回成功标志
private String suceess;
// map 封装
private Map result;
// 有参
public ResultMap(String status, String suceess, Map result) {
this.status = status;
this.suceess = suceess;
this.result = result;
}
// 默认参
public ResultMap() {
}
// set get
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getSuceess() {
return suceess;
}
public void setSuceess(String suceess) {
this.suceess = suceess;
}
public Map getResult() {
return result;
}
public void setResult(Map result) {
this.result = result;
}
}
5、数据库
6、给前端提供接口(前提在同一个局域网下)
不知道的话,cmd-->ipconfig
例:192.168.1.117:8088/select/soap
此时就可以将连接以文档的形式给前端,进行测试了。(不会写接口给前端?别慌,看我下一篇文章)
声明:若前端请求地址发生跨域如下图报错,可以尝试在Controller层添加一个注解-->@CrossOrigin注解,并重启服务器,重新进行访问。
错误信息: No 'Access-Control-Allow-Origin' header is present on the requested resource ...
解决详情:https://blog.csdn.net/qq_37647296/article/details/89401499