java 调用webservice接口(.asmx).net

1、适应范围

   拿到对接公司的一个接口,是用.net编写的webservice接口(.asmx),接口方会给到接口地址、方法名、参数及对方那边的返回值类型、测试数据。如果没有一下这些,那么就可以向客户那边索取。例(我这边接口方提供的数据):

java 调用webservice接口(.asmx).net_第1张图片

 

2、拿到地址后访问,点击网址查看是否可以访问,并找到对应的方法(以下蓝色字体就是方法名:He'l'loWorld、QzjSaveEvent...

java 调用webservice接口(.asmx).net_第2张图片

能直接访问代表接口是通的(没有类似这样的页面,联系接口方更改),

链接后加?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;
    }
}

实体类2Map封装并返回状态码

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、数据库

java 调用webservice接口(.asmx).net_第3张图片

6、给前端提供接口(前提在同一个局域网下)

不知道的话,cmd-->ipconfig

例:192.168.1.117:8088/select/soap

此时就可以将连接以文档的形式给前端,进行测试了。(不会写接口给前端?别慌,看我下一篇文章

声明:若前端请求地址发生跨域如下图报错,可以尝试在Controller层添加一个注解-->@CrossOrigin注解,并重启服务器,重新进行访问。

java 调用webservice接口(.asmx).net_第4张图片

错误信息: No 'Access-Control-Allow-Origin' header is present on the requested resource ...

解决详情:https://blog.csdn.net/qq_37647296/article/details/89401499

 

你可能感兴趣的:(webService,java)