Webservice接口通用实现

本文通过具体案例介绍了一种简洁高效的WebService接口设计方法,重点强调了合理使用Request、Response及各类辅助类的重要性,并提供了一个加法接口的设计示例。

看到许多中小项目的webservice接口的源代码,不禁有个吐槽的冲动。除了会用CXF,Axis2等神级框架,其他的懒得动了,都是Ctrl+V,Ctrl+C,把其他模块的Request,Response贴过来。一旦增加某个特性,不得不在所有Request,Response遨游一遍。早知今日,何必当初呢。

  写一个好的Weservice Interface,关键是要多多总结。除了有Request,Response之外,还有很多。总结如下有:

    Request:webservice的输入。

    Response:webservice输出。

    DataRsponse:带结果集的webservice输出。

    ResultData:结果集,不同的interface,其ResultData不一样。

    ReslutInfo:描述调用请求成功或者失败的对象。

    WebServiceTemplate:模板类,定义如何调用下层函数,如何处理异常错误的流程

 

    ResultDataCallback:回调类,与template配合,适用【返回结果集】操作,比如【获取用户信息】,【下订单】

    ResultCallback:回调类,与Template配置,适用于【不返回带结果集的接口,比如【修改用户名】

 

    ResponseFactory:用来组装 webservice消息 的工厂类。

    ResultInfoFactory:用来处理异常信息的 工厂类,这个一个接口,为它实现一个默认实例吧。

 

  有了这些小弟们,任何webservice接口的定义都能轻易搞定,不信我举个例子给你,咱们以【加法】为例!

  AddRequest:

public class AddRequest extends Request{
    
    private int add;
    private int added;
    
    public int getAdd() {
        return add;
    }
    public void setAdd(int add) {
        this.add = add;
    }
    public int getAdded() {
        return added;
    }
    public void setAdded(int added) {
        this.added = added;
    }
    
}

AddResonse:


public class AddResponse extends DataResponse<AddResultData>{

    private AddResultData resultData;

    public AddResultData getResultData() {
        return resultData;
    }

    public void setResultData(AddResultData resultData) {
        this.resultData = resultData;
    }

}

AddResultData:

public class AddResultData implements ResultData{

    private int sum;

    public AddResultData(int sum) {
        super();
        this.sum = sum;
    }

    public AddResultData() {
        super();
    }

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }
}

一个简单的webservice接口:

public class Soap {

    
    public AddResponse add(final AddRequest request){
        return WebServiceTemplate.doResult(new ResultDataCallback<AddRequest,AddResponse,AddResultData>(){

            public AddResultData done() throws Exception {
                return new AddResultData(request.getAdd()+request.getAdded());
            }

            public AddResponse getRsp() {
                return new AddResponse();
            }

        });
    }

}

一个简单的TestCase测试:

public class TestSoap {

    
    @Test
    public void testAdd(){
        AddRequest add = new AddRequest();
        add.setAdd(1);
        add.setAdded(2);
        
        Soap soap = new Soap();
        AddResponse rsp =soap.add(add);
        assertEquals(3,rsp.getResultData().getSum());
    
        assertEquals("0",rsp.getResultInfo().getResultCode());
        assertEquals("success",rsp.getResultInfo().getResultDesc());
    }

}

虽然这些很简单,但是能够解决80%的问题。剩下20%还要根据实际情况来定。况且,这些代码在你的手中还有持续改优化的空间。千万不要做一个爱Copy的孩子。

相关的代码附件地址:【http://files.cnblogs.com/MartinChen999/webservice.rar】
### 创建 Java 调用 WebService 接口通用实现方法 为了创建一个能够调用WebService接口通用Java类,该类应当具备灵活性和可扩展性以便适应不同的Web服务需求。下面是一个基于JAX-WS (Java API for XML Web Services) 的例子,它允许开发者通过WSDL定义的服务端点轻松地发送请求并接收响应。 #### 1. 添加依赖项 如果项目使用Maven构建,则需在`pom.xml`中加入如下依赖: ```xml <dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.3.1</version> </dependency> <!-- 如果需要支持更广泛的特性 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>rt</artifactId> <version>2.3.1</version> </dependency> ``` #### 2. 定义通用WebService客户端类 ```java import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConnection; import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import jakarta.xml.ws.Dispatch; import jakarta.xml.ws.Service; import java.io.ByteArrayInputStream; public class GenericWebServiceClient { private final String wsdlLocation; private final QName serviceName; public GenericWebServiceClient(String wsdl, String serviceNamespace, String serviceName){ this.wsdlLocation = wsdl; this.serviceName = new QName(serviceNamespace, serviceName); } /** * 发起 SOAP 请求并获取结果. */ public String invokeOperation(String operationName, String requestBodyXml) throws Exception { Service service = Service.create(new URL(wsdlLocation), serviceName); Dispatch<Source> dispatch = service.createDispatch( new QName("", operationName), Source.class, jakarta.xml.ws.Service.Mode.MESSAGE ); ByteArrayInputStream inputStream = new ByteArrayInputStream(requestBodyXml.getBytes()); StreamSource sourceRequest = new StreamSource(inputStream); // Send the request and get a response Source result = dispatch.invoke(sourceRequest); return convertStreamToString(result.getSystemId(), result.getInputStream()); } } ``` 此代码片段展示了如何利用 JAX-WS 提供的功能来动态加载 WSDL 文件,并根据指定的操作名称和服务命名空间建立连接[^1]。这里的关键在于 `invokeOperation()` 方法,它可以接受任意形式的 XML 字符串作为输入体,并将其传递给目标 Web 服务操作;之后再将服务器返回的结果转换成字符串格式返回给调用方。 对于复杂的 Webservice 调用场景,可能还需要考虑设置更多的配置选项,比如超时时间、认证信息等。此外,在实际应用中也建议增加异常处理逻辑以增强程序健壮性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值