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;
     }

  • 相关阅读:
    TongJI Online Judge预赛(3): Game
    堆栈小应用:配对
    在.net中使用Udp协议创建简单的聊天程序
    TongJI Online Judge预赛(2): LOVE LETTER
    全排列问题之递归求解
    如何打造RSS阅读器
    Html 常用标志总结
    实现页面的分帧显示
    每天OnlineJudge之 “数素数”
    文本编辑器中,如何设计 撤销/重复栈
  • 原文地址:https://www.cnblogs.com/pureEve/p/6547369.html
Copyright © 2011-2022 走看看