java调用webservice接口

前言

WebService接口和RESTful接口,都是用于在互联网上进行数据传输和交互的技术手段。那它们有什么区别呢?在java中又如何调用WebService接口呢?

一、什么是WebService接口,同RESTful接口有什么区别

WebService接口:
WebService(也称为SOAP WebService)是一种基于XML格式进行数据传输的互联网服务。它通过使用HTTP或HTTPS等协议,在互联网上实现数据的传输和交互。WebService接口具有平台无关性,能够通过XML等格式描述不同系统的交互行为。Webservice可以实现数据的统一和集中的管理和交换,具有良好的数据描述、管理以及与数据系统的接口技术能力。

RESTful接口:
RESTful API(Representation State Transferful Application Programming Interface)则是一种面向资源设计的设计理念在网络应用程序的编程方式中形成的API标准。简单来说,它以更灵活的Web交互为基点,对信息进行格式化或传递化后设计一种便于进行交换或共享的接口。RESTful接口使用HTTP协议进行通信,并且通常使用JSON或XML等格式来传输数据。这种接口设计风格具有轻量级、易于理解、易于实现等特点,因此在现代Web开发中得到了广泛应用。

两者的区别:
1、架构设计:WebService基于SOAP协议,是一种基于XML的协议,而RESTful接口则基于HTTP协议,使用JSON或XML等格式进行数据传输。
2、灵活性:RESTful接口更加灵活和轻量级,可以更好地适应现代Web开发的需求。而WebService则相对较为复杂和笨重。
3、平台无关性:WebService虽然具有一定的平台无关性,但相对来说较为受限。而RESTful接口具有更好的跨平台性,可以在不同系统和设备之间轻松地交换数据。
4、数据交换方式:WebService使用SOAP协议进行数据交换,而RESTful接口则通过HTTP协议进行数据请求和响应的交互。

总结:
相比较而言,RESTful接口在应用上更加灵活和广泛。由于其轻量级、易于理解和实现的特点,RESTful接口在现代Web开发中得到了广泛的应用。它能够更好地适应不同系统和设备之间的数据交换需求,具有更好的跨平台性和可扩展性。而WebService虽然也具有平台无关性,但相对来说较为复杂和受限。

二、java调用WebService接口

java调用WebService接口有多种方式,比如通过HttpURLConnection、生成java客户端、AXIS或者通过HttpClient,这些方式尝试之后还是比较喜欢通过HttpClient方式来调用,代码如下:

1.maven仓库地址

<!--httpClient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.3.4</version>
</dependency>
<!--dom4j,解析返回值使用-->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.4</version>
</dependency>
<!--hutoll-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.32</version>
</dependency>

2.代码示例如下

import cn.hutool.core.collection.CollectionUtil;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.List;

/**
 * httpClient方式调用webservice接口
 */
public class WebServiceTest {
    public static void main(String[] args) throws Exception{
        doWebService();
    }

    public static String doWebService() throws Exception{
        //url去除wsdl(接口来源于网络)
        String url="http://www.dneonline.com/calculator.asmx";
        /**
         * Subtract通过wsdl文档中<wsdl:message> 和 <wsdl:part>获取
         * http://tempuri.org/为wsdl中targetNamespace值
         * intA和intB在wsdl文档对Subtract方法描述中
         * */
        String param= "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                "<soap:Body>" +
                "<Subtract xmlns=\"http://tempuri.org/\">" +
                "<intA>10</intA>" +
                "<intB>5</intB>" +
                "</Subtract>" +
                "</soap:Body>" +
                "</soap:Envelope>";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost=new HttpPost(url);
        //设置请求头
        httpPost.addHeader("Content-Type","text/xml; charset=utf-8");
        //获取wsdl中SOAPAction值
        httpPost.addHeader("SOAPAction", "http://tempuri.org/Subtract");
        httpPost.setEntity(new StringEntity(param));
        CloseableHttpResponse response = httpClient.execute(httpPost);
        String result = EntityUtils.toString(response.getEntity());
        System.out.println("获取webservice返回值:"+result);
        String subtractResult = getResult(result, "SubtractResult");
        System.out.println("获取接口返回值:"+subtractResult);
        return subtractResult;
    }

    /**
     * 解析接口返回值(简易处理)
     * @param webserviceResult 接口返回值
     * @param resultName 返回值名称
     * @return
     * */
    public static String getResult(String webserviceResult,String resultName) throws Exception{
        Document document = DocumentHelper.parseText(webserviceResult);
        Element rootElement = document.getRootElement();
        return forElement(rootElement,resultName);
    }

    /**
     * 递归匹配resultName值
     * @param element
     * @param resultName
     * @return
     * */
    public static String forElement(Element element,String resultName){
        List<Element> elements = element.elements();
        if(CollectionUtil.isNotEmpty(elements)){
            for (Element childElement : elements) {
                if(childElement.getName().equals(resultName)){
                    return childElement.getText();
                }else{
                    return forElement(childElement,resultName);
                }
            }
        }
        return null;
    }
}
webservice接口调用有多种方式。其中一种是通过生成的客户端代码进行调用。可以使用简单调用方式,即在项目中编写一个测试类,通过调用生成的代码来调用webservice接口。例如,在Java中可以使用以下代码进行调用: ```java TestWebservice ws = new TestWebserviceService().getTestWebservicePort(); String name = ws.getvalue("张三"); System.out.println("输出:"+name); ``` 这段代码中,首先创建了一个TestWebservice对象,然后通过该对象调用接口中的方法。在这个例子中,调用了`getvalue`方法,并传入了参数"张三"。最后,将返回的结果打印出来。\[1\] 另一种方式是使用HttpURLConnection进行调用。这种方式可以通过发送HTTP请求来调用webservice接口。具体的实现可以参考相关的文档和示例代码。\[4\] 还有其他的调用方式,比如使用Ajax进行调用,或者使用Apache的AXIS框架进行调用。具体的选择取决于你的需求和技术栈。\[5\] 总之,webservice接口调用可以通过生成的客户端代码、HttpURLConnection、Ajax或者其他框架来实现。具体的选择取决于你的需求和技术栈。 #### 引用[.reference_title] - *1* *2* [Webservice接口的生成及调用](https://blog.csdn.net/qq_38111316/article/details/123158779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [调用webservice服务方式总结](https://blog.csdn.net/liuyunyihao/article/details/125083983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值