java调用webservice接口的方法有哪些?如何实现?

2020-04-21 13:24:10 java常见问答 9959

有过java相关开发经验的小伙伴们,对webservice接口应该不会感到陌生,因为我们平时在需要使用到短信群发提交功能时候,就需要调用webservice了。下面就跟小编一起来看看,在java中调用webservice接口有哪些方法呢?

springboot 中的动态调用方法。示例如下:

package com.credithc.re.sign.webservice;
import com.credithc.re.sign.service.RedisService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import java.util.UUID;
@WebService(name = "reSignService")
@Component
public class ReSignService
{
    @Autowired
    private RedisService redisService;
    @WebMethod
    @WebResult
    public String reSign(@WebParam(name = "channel") String channel
        , @WebParam(name = "templateId") String templateId
        , @WebParam(name = "isSeal") int isSeal
        , @WebParam(name = "strJson") String strJson
        , @WebParam(name = "callBackUrl") String callBackUrl)
    {
        String uuid = UUID.randomUUID()
            .toString()
            .replaceAll("-", "");
        redisService.set(uuid, callBackUrl);
        callBackUrl = "http://172.19.0.153:8081/re/sign/callback" + "?id=" + uuid;
        // 创建动态客户端
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://172.19.0.153:8080/scs-web/webservice/SignService?wsdl");
        Object[] objects = new Object[0];
        try
        {
            QName opName = new QName("http://webservice.scs.credithc.com/", "signContract");
            objects = client.invoke(opName, channel, templateId, isSeal, strJson, callBackUrl);
            System.out.println("返回数据:" + objects[0]);
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
        }
        return "请求成功";
    }
}
package com.credithc.re.sign.config;
import com.credithc.re.sign.webservice.ReSignService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class CxfConfig
{
    @Autowired
    private Bus bus;
    @Autowired
    private ReSignService reSignService;
    @Bean
    public Endpoint endpoint()
    {
        EndpointImpl endpoint = new EndpointImpl(bus, reSignService);
        endpoint.publish("/reSignService");
        return endpoint;
    }
}

使用Http方式调用远程的webservice:

package com.webservice;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class WebServiceClient2
{
    public static void main(String[] args)
    {
        try
        {
            // 1 指定WebService服务的请求地址:
            String wsUrl = "http://172.19.0.153:8080/scs-web/webservice/SignService";
            // 2 创建URL:
            URL url = new URL(wsUrl);
            // 3 建立连接,并将连接强转为Http连接
            URLConnection conn = url.openConnection();
            HttpURLConnection con = (HttpURLConnection) conn;
            // 4,设置请求方式和请求头:
            con.setDoInput(true); // 是否有入参
            con.setDoOutput(true); // 是否有出参
            con.setRequestMethod("POST"); // 设置请求方式
            con.setRequestProperty("content-type", "text/xml;charset=UTF-8");
            // 5,手动构造请求体
            String channel = "1007";
            String templateId = "3021";
            String isSeal = "1";
            String strJson = "{"certApplys":[{"useridno":"N256613448988875","address":"山东省德州临邑县恒源","engName":"test","telno":"15869611844","email":"test@credithc.com","username":"CHENG AI-HSIANG","idTypeCode":"Z"}],"singnalElement":{"a":"","b":"√","product":"利投宝12_B","amount":"100,000.00","idType":"户照","year":2016,"paybankName":"兴业银行","backbankCardNo":"622908357966352914","idNo":"N213447","month":12,"lockTime":12,"paybankCardNo":"622908357966352914","bigAmount":"壹拾万元整","name":"CHENG AI-HSIANG","customerId":"C_20161214000158","contractId":"L_20161214291739","backbankName":"兴业银行","yearIrr":"9.6%","payName":"CHENG AIHSIANG","day":14}}
";
            String callBackUrl = "?";
            String requestBody = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"";
            requestBody += " xmlns:xsd="http://www.w3.org/2001/XMLSchema"";
            requestBody += " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">";
            requestBody += "<soapenv:Body>";
            requestBody += "<q0:signContract xmlns:q0="http://impl.webservice.scs.credithc.com/">";
            requestBody += "<channel>" + channel + "</channel>";
            requestBody += "<templateId>" + templateId + "</templateId> ";
            requestBody += "<isSeal>" + isSeal + "</isSeal> ";
            requestBody += "<strJson>" + strJson + "</strJson> ";
            requestBody += "<callBackUrl>" + callBackUrl + "</callBackUrl> ";
            requestBody += "</q0:signContract>";
            requestBody += "</soapenv:Body>";
            requestBody += "</soapenv:Envelope>";
            // 6,通过流的方式将请求体发送出去:
            OutputStream out = con.getOutputStream();
            out.write(requestBody.getBytes());
            out.close();
            // 7,服务端返回正常:
            int code = con.getResponseCode();
            if (code == 200)
            { // 服务端返回正常
                InputStream is = con.getInputStream();
                byte[] b = new byte[1024];
                StringBuffer sb = new StringBuffer();
                int len = 0;
                while ((len = is.read(b)) != -1)
                {
                    String str = new String(b, 0, len, "UTF-8");
                    sb.append(str);
                }
                System.out.println(sb.toString());
                is.close();
            }
            con.disconnect();
        }
        catch (Exception e)
        {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

直接AXIS调用远程的webservice。个人觉得这种方法比较适合那些高级选手,因为他们能直接看懂XML格式的WSDL文件,像我自己是看不懂的,尤其我不是专门搞这行的,即使一段时间看懂了,一直不用,很快也就忘记了。直接调用模式如下:

import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient
{
    public static void main(String[] args)
    {
        try
        {
            String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
            // 直接引用远程的wsdl文件  
            // 以下都是套路  
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(endpoint);
            call.setOperationName("addUser"); // WSDL里面描述的接口名称  
            call.addParameter("userName"
                , org.apache.axis.encoding.XMLType.XSD_DATE
                , javax.xml.rpc.ParameterMode.IN); // 接口的参数  
            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); // 设置返回类型  
            String temp = "测试人员";
            String result = (String) call.invoke(new Object[]
            {
                temp
            });
            // 给方法传递参数,并且调用方法  
            System.out.println("result is " + result);
        }
        catch (Exception e)
        {
            System.err.println(e.toString());
        }
    }
}

好了,那么以上就是在java中调用webservice接口的几种常用方法的示例了,如果你还想了解更多java一些知识问答,就继续关注本站消息吧,更多精彩内容等你来获取。