zoukankan      html  css  js  c++  java
  • webService调用

    本文主要讲述,使用java语言调用webservice的几种方法,和针对于获取的报文文件解析的一些看法。

    再次之前先推荐一种工具,soapui这个工具可以很好的实现测试webservice的连通性,并且可以直接获取、

    webservice服务上对应的值。

    第一部分:调用方法

    第一种方式采用soap的方式:下面是需要引用的包axis.jar

    import javax.xml.*;

    下面附上一部分的测试代码:

    public String getwebservice() throws Exception {  
      String temp = "";//用来存放返回的报文内容
      try {

        //实例化一个soap连接对象工厂
        SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance();

        //实例化一个连接对象
        SOAPConnection connection = soapConnFactory.createConnection(); 

        //实例化一个消息对象          
        MessageFactory messageFactory = MessageFactory.newInstance();

        //实例化一个消息
        SOAPMessage message = messageFactory.createMessage();       

        //获取消息中soap消息部分的句柄 
        SOAPPart soapPart = message.getSOAPPart();

        //获取soap消息部分中的信封句柄
        SOAPEnvelope envelope = soapPart.getEnvelope();

        //获取信封中需要填写的请求报文部分的句柄
        SOAPBody body = envelope.getBody();      

        //以上内容均是实例化各个对象

        //下面函数作用为构建请求头,一共三个参数,其中第一个参数为要访问webservice中的那个函数的函数名(注意大小写敏感)

        第二个参数需要按照情况来拼接,可以先访问对方的webservice地址查看是否标签中有这个元素

        第三个参数为访问空间,也就是对应于wsdl文档中的namespace内容。          
        SOAPElement bodyElement = body.addChildElement(envelope.createName(operationName , "web", targetNamespace));

        //此访问距离假定我要访问的webservice函数有两个参数

        //下面是第一个参数为参数名(大小写敏感)而第二个参数和第三个参数要视具体的webservice而定
        SOAPElement firstElemnt = bodyElement.addChildElement(envelope.createName("" , "", ""));
        Name firstName = envelope.createName("type");

        //firstName为入参一的值,后面的是入参的类型
        firstElemnt.addAttribute(firstName, "String");
        firstElemnt.addTextNode();

        //以上就是第一个参数的添加

        //下面是第二个参数的添加和第一个没有任何区别
        SOAPElement secondElemnt = bodyElement.addChildElement(envelope.createName("" , "", ""));
        Name secondName = envelope.createName("type");
        secondElemnt.addAttribute(secondName, "String");
        secondElemnt.addTextNode();     

        //下面这句话的意思是保存消息的修改               
        message.saveChanges();

        //下面的webServiceURL为webservice的访问地址
        String destination = webServiceURL;

        //下面为调用
        SOAPMessage reply = connection.call(message, destination);

        //如果返回的消息不为空需要进行处理
        if(reply!=null)
        {

            //这部分的处理就是将返回的值转换为字符串的格式,也就是流和串之间的转换
            Source source = reply.getSOAPPart().getContent();
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            ByteArrayOutputStream myOutStr = new ByteArrayOutputStream();
            StreamResult res = new StreamResult();
            res.setOutputStream(myOutStr);
            transformer.transform(source,res);

            //针对于汉子的编码格式,需要自己制定
            temp = myOutStr.toString("UTF-8"); 
        }      

        //注意!一定要关闭连接
        connection.close();
      } 
      catch(Exception e) 
      {
        System.out.println(e.getMessage());
      }   
      if(temp == null)
      {
       temp = "";
      }
      return temp;
     }

    第二种使用java语言调用webservice方法如下:

    第二种方法使用的httpclient的方法,需要引入的包为apache的包

    import org.apache.*

    下面是测试代码:

     public String updateLeechdom() throws Exception

    {

      //首先定义访问的格式和头,这部分的由来最简单的办法就是直接将对方提供的webservice地址在浏览器中访问获取  

      //注意用转义符处理特殊符号

      String xml = "<?xml version="1.0" encoding="utf-8"?> ";
          xml = xml + "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">";
          xml = xml + "<soap:Body>";
          xml = xml + "<function1 xmlns="namespace">";
          xml = xml +    "<para1>" + para1 + "</para1>";
          xml = xml + "<para2>" + para2 + "</para2>";
           xml = xml + "</function2>";
          xml = xml + "</soap:Body>";
          xml = xml + "</soap:Envelope>";

      //用来盛放返回值

          String result ="";

          PostMethod postMethod = new  PostMethod(webServiceURL);
          HttpClientParams httpClientParams = new HttpClientParams();

      //设置链接的访问时间
          httpClientParams.setConnectionManagerTimeout(999999);

      //设置超时时间
          httpClientParams.setSoTimeout(999999);

      //创建http线程
          MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
          HttpClient httpClient = new HttpClient(httpClientParams,connectionManager);
          postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(11, true));
          try

          {

      //设置返回值的编码格式
           postMethod.setRequestEntity(new StringRequestEntity(xml, "text/xml", "GBK"));
           postMethod.addRequestHeader("Connection", "close");

      //设置一个返回的状态值用以判断是否调用webservice成功
           int statusCode = httpClient.executeMethod(postMethod);
           if (statusCode != HttpStatus.SC_OK) {
           } else {

      //下面还是老规矩进行流和字符串之间的转换
              InputStream out = postMethod.getResponseBodyAsStream();
             BufferedReader in = new BufferedReader(new InputStreamReader(out));
             StringBuffer buffer = new StringBuffer();
             String line = "";
             while ((line = in.readLine()) != null){
               buffer.append(line);
             }
             result = buffer.toString();

           }
         } catch (Exception e) {
     
         } finally {
            postMethod.releaseConnection();
         }
            return result;

    }

    第三种使用java语言调用webservice方法如下:

    第三种方法引用的是javax包

    下面是测试代码:

     public String test() throws Exception 
     {  

      //用来存放返回值串
      String result = "";
      try 
      {

     //这一句的作用是定义系统的操作变量,有些程序在不添加这段代码的时候也运行正常。
       System.setProperty(org.apache.axis.client.ServiceFactory.SERVICEFACTORY_PROPERTY,"org.apache.axis.client.ServiceFactory" );

      //定义访问变量,参数一位webservice的访问地址,参数二位webservice使用的命名空间
       QName servicename = new QName(webServiceURL,namespace);

      //定义操作变量,操作变量中传入的参数为前面已经定义的访问变量
       javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(servicename);

      //实例化调用变量
       javax.xml.rpc.Call call = service.createCall();

      //添加调用地址
       call.setTargetEndpointAddress(webServiceURL);

      //添加调用的函数的命名空间以及函数名称
       QName operationname = new QName(namespace, operationName);

      //设置调用操作

       call.setOperationName(operationname);

     //定义传入的参数,参数1是入参名大小写敏感,参数2为参数类型(字符/数字……),参数3为参数类型(入参/出参)
       call.addParameter("para1",XMLType.XSD_STRING,ParameterMode.IN );

     //第二个参数的定义同上
       call.addParameter("para2",XMLType.XSD_STRING,ParameterMode.IN );

      //定义返回值的格式,第一个参数为命名空间,第二个参数为返回值类型,这里需要注意的是返回值的类型是webservice开发商提供,我们需要与其保持一致
       QName returnname = new QName(namespace, "string");
       call.setReturnType(returnname, String.class);

      //进行调用传入对应入参的值,并且将返回的对象转换为字符串。
       result = call.invoke(new Object[]{para1,para2}).toString();

      //异常处理
       if(result==null)
       {
        result = "";
       }   
      }
      catch (ServiceException e) 
      {
       e.printStackTrace();
      }  
      catch (RemoteException e) 
      {
       e.printStackTrace();
      }
      catch (Exception e)
      {
       e.printStackTrace();
      }
      return result; 
     }

    第四种使用java语言调用webservice方法如下:

    第四种方法引入的包为axis的包

    import org.apache.axis.*

    下面是测试代码:

    public String test() throws Exception 
     {

    //接收返回值
     String result ="";

    //实例化访问对象
     Service service = new Service();   

    //实例化调用对象
        Call call = (Call) service.createCall();

    //在调用对象中添加webservice地址
        call.setTargetEndpointAddress(new java.net.URL(webServiceURL));  

    //在调用对象中添加webservice对应的命名空间,以及将要调用的函数名
        call.setOperationName(new QName(namespace,operationName));

    //设置入参,第一个参数是命名空间以及参数名,这两个参数是采用一个Qname变量打包传入的,第二个参数是入参的类型(字符或者数字)第三个参数是入参种类

    //“IN”的含义代表入参
        call.addParameter(new QName(namespace,"para1"), 
               org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

    //第二个参数与前面一样
        call.addParameter(new QName(namespace,"para2"), 
               org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

    //是否是soapaction这里需要看webservice是否要求如下格式,如果没有要求可以不添加此设置

        call.setUseSOAPAction(true);

    //设置返回值格式(字符串或者组装对象)
        call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);

    //如果前面要求是soapaction的话需要添加下面这句话,用来之中是访问那个命名空间上的那个方法
        call.setSOAPActionURI(namespace + "/" + operationName);

    //调用,参入两个入参para1和para2的值,并且将返回值转换为String类型
        result = call.invoke(new Object[]{para1,para2}).toString();
        return result;
     }

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/pureEve/p/6547369.html
Copyright © 2011-2022 走看看