• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

调用webservice服务方式

武飞扬头像
流云一号
帮助1

        本人日常工作中经常与不同软件厂商进行接口对接,不同的厂商接口调用方式五花八门,但主要分为两大阵营:http和webservice。本文以Java为例,总结调用webservice服务的几种方式。

        一、利用命令或工具将WebService提供的wsdl文件生成对应的java类,这样就可以像调用本地类一样调用webService提供的接口。这种方法的优点是调用简单,无需自己编写太多的东西。缺点同样很明显,生成的代码过于庞大,不便于阅读,显得很累赘。

        二、AXIS远程调用,代码如下:

  1.  
    import org.apache.axis.Constants;
  2.  
    import org.apache.axis.client.Call;
  3.  
    import org.apache.axis.client.Service;
  4.  
     
  5.  
    import javax.xml.namespace.QName;
  6.  
     
  7.  
    public class WebServiceTest {
  8.  
     
  9.  
    public static void main(String[] args) {
  10.  
    //服务地址
  11.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  12.  
    //命名空间
  13.  
    String namespaceURI = "http://www.exampletest.com/";
  14.  
    //方法名
  15.  
    String method = "invoke";
  16.  
    try {
  17.  
    Service service = new Service();
  18.  
    Call call = (Call) service.createCall();
  19.  
    call.setTargetEndpointAddress(url);
  20.  
    //设置要调用的方法
  21.  
    call.setOperationName(new QName(namespaceURI, method));
  22.  
    //设置要返回的数据类型
  23.  
    call.setReturnType(new QName(namespaceURI, method), String.class);
  24.  
    call.setUseSOAPAction(true);
  25.  
    call.setSOAPActionURI(namespaceURI method);
  26.  
    //设置入参
  27.  
    call.addParameter(new QName(namespaceURI, "consumer"), Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
  28.  
    call.addParameter(new QName(namespaceURI, "serviceName"), Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
  29.  
    call.addParameter(new QName(namespaceURI, "params"), Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
  30.  
     
  31.  
    //调用方法并传递参数
  32.  
    String resultStr = (String) call.invoke(new Object[]{"test", "queryOrder", "{\"tradeno\":\"1648100061001\",\"mchid\":\"10001\"}"});
  33.  
    System.out.println("服务调用结果:" resultStr);
  34.  
    } catch (Exception e) {
  35.  
    e.printStackTrace();
  36.  
    }
  37.  
    }
  38.  
    }
学新通

 对应jar包的maven依赖:

  1.  
    <dependency>
  2.  
    <groupId>org.apache.axis</groupId>
  3.  
    <artifactId>axis</artifactId>
  4.  
    <version>1.4</version>
  5.  
    </dependency>
  6.  
    <dependency>
  7.  
    <groupId>org.apache.axis</groupId>
  8.  
    <artifactId>axis-jaxrpc</artifactId>
  9.  
    <version>1.4</version>
  10.  
    </dependency>

        该种方式调用简单,一般不需要自己组织请求报文和解析返回报文 。

        三、通过HttpURLConnection进行调用,代码如下:

  1.  
    import java.io.BufferedReader;
  2.  
    import java.io.InputStream;
  3.  
    import java.io.InputStreamReader;
  4.  
    import java.io.OutputStream;
  5.  
    import java.net.HttpURLConnection;
  6.  
    import java.net.URL;
  7.  
     
  8.  
    public class WebServiceTest {
  9.  
     
  10.  
    public static void main(String[] args) throws Exception {
  11.  
    //服务地址
  12.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  13.  
    //第一步:创建服务地址
  14.  
    URL httpUrl = new URL(url);
  15.  
    //第二步:打开一个通向服务地址的连接
  16.  
    HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
  17.  
    //第三步:设置参数
  18.  
    //3.1发送方式设置:POST必须大写
  19.  
    connection.setRequestMethod("POST");
  20.  
    //3.2设置数据格式:content-type,这个根据实际情况来确定
  21.  
    connection.setRequestProperty("content-type", "application/atom xml;charset=utf-8");
  22.  
    //3.3设置输入输出,因为默认新创建的connection没有读写权限,
  23.  
    connection.setDoInput(true);
  24.  
    connection.setDoOutput(true);
  25.  
     
  26.  
    //第四步:组织SOAP数据,发送请求
  27.  
    String soapXML = getXML("test", "queryOrder", "{\"tradeno\":\"1648100061003\",\"mchid\":\"10001\"}");
  28.  
    //将信息以流的方式发送出去
  29.  
    OutputStream os = connection.getOutputStream();
  30.  
    os.write(soapXML.getBytes());
  31.  
    //第五步:接收服务端响应,打印
  32.  
    InputStream is = connection.getInputStream();
  33.  
    InputStreamReader isr = new InputStreamReader(is);
  34.  
    BufferedReader br = new BufferedReader(isr);
  35.  
     
  36.  
    StringBuilder sb = new StringBuilder();
  37.  
    String temp = null;
  38.  
    while(null != (temp = br.readLine())){
  39.  
    sb.append(temp);
  40.  
    }
  41.  
    System.out.println("服务调用结果:" sb.toString());
  42.  
    is.close();
  43.  
    isr.close();
  44.  
    br.close();
  45.  
    }
  46.  
     
  47.  
    /**
  48.  
    * @Author admin
  49.  
    * @Description 组装xml报文
  50.  
    * @Date 15:47 2022/5/1
  51.  
    * @Param [consumer, serviceName, para]
  52.  
    * @return java.lang.String
  53.  
    **/
  54.  
    public static String getXML(String consumer, String serviceName, String paraStr){
  55.  
    String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dar=\"http://www.darewayhealth.com/\">\n"
  56.  
    " <soapenv:Header/>\n"
  57.  
    " <soapenv:Body>\n"
  58.  
    " <dar:invoke>\n"
  59.  
    " <!--Optional:-->\n"
  60.  
    " <dar:consumerId>" consumer "</dar:consumerId>\n"
  61.  
    " <!--Optional:-->\n"
  62.  
    " <dar:serviceName>" serviceName "</dar:serviceName>\n"
  63.  
    " <!--Optional:-->\n"
  64.  
    " <dar:params>" paraStr "</dar:params>\n"
  65.  
    " </dar:invoke>\n"
  66.  
    " </soapenv:Body>\n"
  67.  
    "</soapenv:Envelope>";
  68.  
    return soapXML;
  69.  
    }
  70.  
    }
学新通

        该种方式一般需要自己组织请求的xml报文,自己解析返回的xml报文。

        四、通过HttpClient进行调用,代码如下:

  1.  
    import org.apache.commons.httpclient.HttpClient;
  2.  
    import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
  3.  
    import org.apache.commons.httpclient.methods.PostMethod;
  4.  
    import org.apache.commons.httpclient.methods.RequestEntity;
  5.  
     
  6.  
    import java.io.ByteArrayInputStream;
  7.  
    import java.io.InputStream;
  8.  
     
  9.  
    public class WebServiceTest {
  10.  
     
  11.  
    public static void main(String[] args) throws Exception {
  12.  
    //服务地址
  13.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  14.  
    HttpClient httpClient = new HttpClient();
  15.  
    PostMethod postMethod = new PostMethod(url);
  16.  
     
  17.  
    String soap = getXML("test", "queryOrder", "{\"tradeno\":\"1648100061003\",\"mchid\":\"10001\"}");
  18.  
     
  19.  
    try {
  20.  
    byte[] b = soap.getBytes("utf-8");
  21.  
    InputStream is = new ByteArrayInputStream(b, 0, b.length);
  22.  
    RequestEntity re = new InputStreamRequestEntity(is, b.length,
  23.  
    "application/atom;charset=utf-8");
  24.  
    postMethod.setRequestEntity(re);
  25.  
    httpClient.executeMethod(postMethod);
  26.  
    String soapResponseData = postMethod.getResponseBodyAsString();
  27.  
    System.out.println("服务调用结果:" soapResponseData);
  28.  
    postMethod.releaseConnection();
  29.  
    } catch (Exception e) {
  30.  
    e.printStackTrace();
  31.  
    }
  32.  
    }
  33.  
     
  34.  
    /**
  35.  
    * @Author admin
  36.  
    * @Description 组装xml报文
  37.  
    * @Date 15:47 2022/5/1
  38.  
    * @Param [consumer, serviceName, para]
  39.  
    * @return java.lang.String
  40.  
    **/
  41.  
    public static String getXML(String consumer, String serviceName, String paraStr){
  42.  
    String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dar=\"http://www.darewayhealth.com/\">\n"
  43.  
    " <soapenv:Header/>\n"
  44.  
    " <soapenv:Body>\n"
  45.  
    " <dar:invoke>\n"
  46.  
    " <!--Optional:-->\n"
  47.  
    " <dar:consumerId>" consumer "</dar:consumerId>\n"
  48.  
    " <!--Optional:-->\n"
  49.  
    " <dar:serviceName>" serviceName "</dar:serviceName>\n"
  50.  
    " <!--Optional:-->\n"
  51.  
    " <dar:params>" paraStr "</dar:params>\n"
  52.  
    " </dar:invoke>\n"
  53.  
    " </soapenv:Body>\n"
  54.  
    "</soapenv:Envelope>";
  55.  
    return soapXML;
  56.  
    }
  57.  
    }
学新通

        该方式的特点同方式三。

        五、通过CloseableHttpClient进行调用,代码如下:

  1.  
    import org.apache.http.Consts;
  2.  
    import org.apache.http.HttpEntity;
  3.  
    import org.apache.http.client.config.RequestConfig;
  4.  
    import org.apache.http.client.methods.CloseableHttpResponse;
  5.  
    import org.apache.http.client.methods.HttpPost;
  6.  
    import org.apache.http.entity.StringEntity;
  7.  
    import org.apache.http.impl.client.CloseableHttpClient;
  8.  
    import org.apache.http.impl.client.HttpClients;
  9.  
    import org.apache.http.util.EntityUtils;
  10.  
     
  11.  
    import java.io.IOException;
  12.  
     
  13.  
    public class WebServiceTest {
  14.  
     
  15.  
    public static void main(String[] args) throws Exception {
  16.  
    //服务地址
  17.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  18.  
    int timeout = 180000;
  19.  
    CloseableHttpClient httpClient = HttpClients.createDefault();
  20.  
    RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();
  21.  
    HttpPost httpPost = null;
  22.  
    CloseableHttpResponse response = null;
  23.  
    HttpEntity resEntity = null;
  24.  
     
  25.  
    try {
  26.  
    httpPost = new HttpPost(url);
  27.  
    httpPost.setConfig(defaultRequestConfig);
  28.  
    String xmlStr = getXML("test", "queryOrder", "{\"tradeno\":\"1648100061003\",\"mchid\":\"10001\"}");
  29.  
    httpPost.setEntity(new StringEntity(xmlStr, Consts.UTF_8));
  30.  
    response = httpClient.execute(httpPost);
  31.  
    resEntity = response.getEntity();
  32.  
    String resStr = EntityUtils.toString(resEntity, Consts.UTF_8);
  33.  
    EntityUtils.consume(resEntity);
  34.  
    System.out.println("服务调用结果:" resStr);
  35.  
    } catch (Exception e) {
  36.  
    e.printStackTrace();
  37.  
    } finally {
  38.  
    try {
  39.  
    if (response != null) {
  40.  
    response.close();
  41.  
    }
  42.  
    } catch (IOException var21) {
  43.  
    var21.printStackTrace();
  44.  
    }
  45.  
    }
  46.  
    }
  47.  
     
  48.  
    /**
  49.  
    * @Author admin
  50.  
    * @Description 组装xml报文
  51.  
    * @Date 15:47 2022/5/1
  52.  
    * @Param [consumer, serviceName, para]
  53.  
    * @return java.lang.String
  54.  
    **/
  55.  
    public static String getXML(String consumer, String serviceName, String paraStr){
  56.  
    String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dar=\"http://www.darewayhealth.com/\">\n"
  57.  
    " <soapenv:Header/>\n"
  58.  
    " <soapenv:Body>\n"
  59.  
    " <dar:invoke>\n"
  60.  
    " <!--Optional:-->\n"
  61.  
    " <dar:consumerId>" consumer "</dar:consumerId>\n"
  62.  
    " <!--Optional:-->\n"
  63.  
    " <dar:serviceName>" serviceName "</dar:serviceName>\n"
  64.  
    " <!--Optional:-->\n"
  65.  
    " <dar:params>" paraStr "</dar:params>\n"
  66.  
    " </dar:invoke>\n"
  67.  
    " </soapenv:Body>\n"
  68.  
    "</soapenv:Envelope>";
  69.  
    return soapXML;
  70.  
    }
  71.  
    }
学新通

        该方式的特点同方式三。 

        六、使用XFire调用,代码如下:

  1.  
    import org.codehaus.xfire.client.Client;
  2.  
    import java.net.URL;
  3.  
     
  4.  
    public class WebServiceTest {
  5.  
     
  6.  
    public static void main(String[] args) {
  7.  
    try {
  8.  
    //服务地址
  9.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  10.  
    //方法名
  11.  
    String method = "invoke";
  12.  
    Client client = new Client(new URL(url));
  13.  
    Object[] result = client.invoke(method, new Object[]{"test", "queryOrder", "{\"tradeno\":\"1648100061003\",\"mchid\":\"10001\"}"});
  14.  
    System.out.println("服务调用结果:" result[0]);
  15.  
    } catch (Exception e) {
  16.  
    e.printStackTrace();
  17.  
    }
  18.  
    }
  19.  
    }
学新通

        需要xfire-all-1.2.6.jar包,maven依赖如下:

  1.  
    <dependency>
  2.  
    <groupId>org.codehaus.xfire</groupId>
  3.  
    <artifactId>xfire-all</artifactId>
  4.  
    <version>1.2.6</version>
  5.  
    </dependency>

        该方式比较古老了,本文只做介绍,后面都用新版本CXF了。值得一提的是,在测试该方式的时候报了一个错误,如下:

  1.  
    Exception in thread "main" java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaComplexType.getAttributes()Lorg/apache/ws/commons/schema/XmlSchemaObjectCollection;
  2.  
    at org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder.hasAttributes(WSDLServiceBuilder.java:662)
  3.  
    at org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder.isWrapped(WSDLServiceBuilder.java:582)
  4.  
    at org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder.visit(WSDLServiceBuilder.java:392)
  5.  
    at org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder.build(WSDLServiceBuilder.java:195)
  6.  
    at org.codehaus.xfire.client.Client.initFromDefinition(Client.java:264)
  7.  
    at org.codehaus.xfire.client.Client.<init>(Client.java:236)
  8.  
    at org.codehaus.xfire.client.Client.<init>(Client.java:246)

        方法不存在,原因其实是包冲突,xfire所依赖的低版本的XmlSchema-1.1.jar与cxf所依赖的高版本的xmlschema-core-2.2.5.jar冲突,删掉高版本的就解决了。

        七、通过CXF调用,代码如下:

  1.  
    import org.apache.cxf.endpoint.Client;
  2.  
    import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
  3.  
     
  4.  
    public class WebServiceTest {
  5.  
     
  6.  
    public static void main(String[] args) {
  7.  
    //服务地址
  8.  
    String url = "http://127.0.0.1:8080/service-test/services/gateway?wsdl";
  9.  
    //方法名
  10.  
    String method = "invoke";
  11.  
    try {
  12.  
    DynamicClientFactory factory = DynamicClientFactory.newInstance();
  13.  
    Client client = factory.createClient(url);
  14.  
    Object[] resultObject = client.invoke(method, new Object[]{"test", "queryOrder", "{\"tradeno\":\"1648100061003\",\"mchid\":\"10001\"}"});
  15.  
    String resultStr = resultObject[0].toString(); //接口调用结果
  16.  
    System.out.println("服务调用结果:" resultStr);
  17.  
    } catch (Exception e) {
  18.  
    e.printStackTrace();
  19.  
    }
  20.  
    }
  21.  
    }
学新通

         该种方式一般不需要自己组织请求报文和解析返回报文,比较简单。

        总结,以上七种方式各有特点,推荐使用AXIS方式或CXF方式或者HTTP方式中的其中一种。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhkighk
系列文章
更多 icon
同类精品
更多 icon
继续加载