代码改变世界

webService调用浅谈(一)

2015-10-12 21:38  D_L  阅读(5969)  评论(0编辑  收藏  举报

本文主要讲述,使用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的方法。

有兴趣的朋友可以尝试一下。

好了第一部分暂时到这里,下一篇将会介绍另外一种的调用方式。