Java调用Webservice接口(.Asmx).Net

1、适应范围

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

67367255-D4DB-97BA-023E-6D257478B007.png

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

1738D363-C5AF-37CE-4235-FA83BB8848C7.png

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

链接后加?wsdl可查看:

http://ip(调用时更改)/WebServiceCode/EventAddService.asmx?wsdl

66EB4FF3-E829-7DA7-BDF5-9B28B52521BF.png

3、编写代码

① 添加maven文件依赖(以下涉及到测试会用到的代码,宁愿多写,不少写)

<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>axis</groupId>
    <artifactId>axis-jaxrpc</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-discovery</groupId>
    <artifactId>commons-discovery</artifactId>
    <version>0.5</version>
</dependency>
<dependency>
    <groupId>wsdl4j</groupId>
    <artifactId>wsdl4j</artifactId>
    <version>1.6.3</version>
</dependency>
<!-- jsonObject的jar包 -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>
<!-- org.json.JSONObject需要的jar包-->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20190722</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

② 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方法,获取如下数据

B3168C50-70B1-45C6-BD9C-A068E3025DF6.png

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<String,Object> 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<String,Object> selectSoap(){
        Map<String,Object> map = new HashMap<>();
        String ref = "";
        List<DataScope> dataScopes =  soapDao.findAll();
        for (int i  = 0;i<dataScopes.size();i++){
            DataScope dataScope = dataScopes.get(i);
            Object[] params = new Object[]{dataScope.getDatasource(),dataScope.getScope()};
            ref = sendWebservice(params,URL);
            map.put(dataScope.getDatasource(),ref);
        }
        return map;
    }

    // 远程webService接口拿到用户那边数据
    public static String sendWebservice(Object[] params, String soapUrl) {
        String soapaction = "http://tempuri.org/"; // 域名,这是在server定义的
        String operationName = "Return_DT_Json";// 调用方法名
        org.apache.axis.client.Service service = new org.apache.axis.client.Service();
        String ret = "";
        try {
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(soapUrl);
            call.setOperationName(new QName(soapaction, operationName)); // 设置要调用哪个方法
            call.addParameter(new QName(soapaction, "DataSource"), // 设置要传递的参数1
                    org.apache.axis.encoding.XMLType.XSD_STRING,
                    javax.xml.rpc.ParameterMode.IN);
            call.addParameter(new QName(soapaction, "Scope"), // 设置要传递的参数2
                    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 + operationName);

            ret = (String) call.invoke(params);// 调用方法并传递参数

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return ret;
    }
}

3、Dao层

import com.example.demo.pojo.DataScope;
import org.springframework.data.jpa.repository.JpaRepository;
// DataScope是实体类,Integer是Id类型
public interface SoapDao extends JpaRepository<DataScope,Integer> {

}

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<String,Object> result;
    // 有参
    public ResultMap(String status, String suceess, Map<String, Object> 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<String, Object> getResult() {
        return result;
    }

    public void setResult(Map<String, Object> result) {
        this.result = result;
    }
}

5、数据库

8FB958EB-8407-1FA0-0608-E8145CD9966A.png

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

不知道的话,cmd-->ipconfig

C71DDC38-C832-0F19-1EDB-4A07484ADC4B.png

例:192.168.1.117:8088/select/soap

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

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

9A1BF041-11E1-7BD7-9917-E7C09647C67D.png

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

解决详情:处理No 'Access-COntrol-Allow-Origin' Header Is Present On The Requested Resource问题

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据