Java中调用WebService

今天被一个问题搞得挺郁闷得。整整弄了一天也没有得出个结果。项目中要调用一个webservice,
传入一个姓名,输出一串字符串。之前我也没有太多经验,网上找了些许资料,大概得参考了一下,自己
编写了几个类。大致如下:
 
package  cn.sh.ideal.util;
import  java.io. * ;
import  java.net. * ;
import  javax.xml.parsers. * ;
import  org.w3c.dom. * ;
 

public   class  RTXWebservice  {
    
private final static String ServiceURI="http://12.110.250.18/RTXMessageWebService/MessageRTX.asmx";
    
public RTXWebservice() {
        
try {
            jbInit();
        }

        
catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    
private static String getSoapRequest(String name){//name为要查询的人名
        try
         
{
             Class cls
=Object.class;


             FileReader isr 
= new FileReader("../src/cn/sh/ideal/xml/rtxsoap.xml");
             BufferedReader reader
=new BufferedReader(isr);
             String soap
="";
             String tmp;
                         
while((tmp=reader.readLine())!=null)
             
{
                 soap
+=tmp;
                 System.out.println(
"soap1:"+soap);
             }

             reader.close();
             isr.close();

             
return soap.replaceAll("name",name);//用传入的参数name替换原来xml中的name
         }

         
catch (Exception ex)
         
{
             ex.printStackTrace();
             
return null;
         }

    }

    
/*
    *返回InputStream是因为w3c DOM中Document的parse方法可
    *以接受InputStream类型的参数,方面在下一步对XML的解释
    
*/

    
private static InputStream getSoapInputStream(String name)throws Exception
    
{
        
try
        
{
            String soap
=getSoapRequest(name);

            
if(soap==null)
            
{
                
return null;
            }

            URL url
=new URL(ServiceURI);
            URLConnection conn
=url.openConnection();
            conn.setUseCaches(
false);
            conn.setDoInput(
true);
            conn.setDoOutput(
true);
            conn.setRequestProperty(
"Content-Length", Integer.toString(soap.length()));
            conn.setRequestProperty(
"Content-Type""text/xml; charset=utf-8");
            conn.setRequestProperty(
"SOAPAction",""http://tempuri.org/GetRTXSessionKey"");
            OutputStream os
=conn.getOutputStream();
            OutputStreamWriter osw
=new OutputStreamWriter(os,"utf-8");
            osw.write(soap);
            osw.flush();
            osw.close();
            InputStream is
=conn.getInputStream();
            
return is;
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            
return null;
        }

    }

    
/*
     *用W3C DOM对返回的XML进行解释
     *@param name String 姓名
     *@return String rtxSessionKey
     
*/

    
public static String getRTXSessionKey(String name)
    
{
        
try
        
{
            Document doc;
            DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(
true);
            DocumentBuilder db
=dbf.newDocumentBuilder();
            InputStream is
=getSoapInputStream(name);
            doc
=db.parse(is);
            NodeList nl
=doc.getElementsByTagName("GetRTXSessionKeyResult");
            Node n
=nl.item(0);
            String rtxsessionkey
=n.getFirstChild().getNodeValue();
            is.close();
            
return rtxsessionkey;
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
            
return null;
        }

    }

    
private void jbInit() throws Exception {
    }

}
 
 rtxsoap.xml文件如下:
<? xml version="1.0" encoding="utf-8" ?>
< 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/" >
  
< soap:Body >
    
< GetRTXSessionKey  xmlns ="http://tempuri.org/" >
      
< strLoginID > name </ strLoginID >
    
</ GetRTXSessionKey >
  
</ soap:Body >
</ soap:Envelope >
 
 
我先把webservice得wsdl文件找到
把request部分得xml粘贴下来保存在一个rtxsoap.xml得文件中并放到根目录+/src/cn/sh/ideal/xml/文件
夹下。我是要调 http://12.110.250.18/RTXMessageWebService/MessageRTX.asmx(内网才能用)
的一个GetRTXSessionKey方法的。根据wsdl文件中的request和response的xml文件我写了上面的
方法。刚开始我用InputStreamReader isr=new InputStreamReader(cls.getResourceAsStream("../src/cn/sh/ideal/xml/rtxsoap.xml"))这种形式去找rtxsoap.xml文件作解析,想把参数弄进去,然后生
成个新的request的xml发给webservice来获取响应,可就是怎么也找不到那个rtxsoap.xml(它明明就是在那里
,可就是找不到,换了很多路径都是不对,估计问题还是处在路径上)后来换用 FileReader isr = new FileReader("../src/cn/sh/ideal/xml/rtxsoap.xml");方法。这下能够读到rtxsoap.xml了。但是一到要与服务器用soap通信
的时候就报错误了,如下:
java.io.IOException: Server returned HTTP response code: 500 for URL: http://12.110.250.18/RTXMessageWebService/MessageRTX.asmx
 at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:791)
 at cn.sh.ideal.util.RTXWebservice.getSoapInputStream(RTXWebservice.java:83)
 at cn.sh.ideal.util.RTXWebservice.getRTXSessionKey(RTXWebservice.java:105)
 at org.apache.jsp.index_jsp._jspService(index_jsp.java:69)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
 at java.lang.Thread.run(Thread.java:534)
找了好久,试了n此也没有解决。其实jbuilder是可以用wizzard来自动的加载一个webservice的(就像.net一样点几下就ok了)
不过项目经理说这样不太好,部署的时候要对axis作配置,可能不太方便。所以还是卡在上面的问题上了。希望有高人能帮
我看看,到底是哪里除了问题。我也会继续的研究下去,争取早日给自己一个答案。 
--------------------------------------------
后来终于搞定了,原来问题不是处在我这边,而是出在写webservice的人那边。他们本身的webservice有问题。
呵呵,原来看问题还是得多视角得考虑。跳出那个圈,整个庐山也就尽收眼底了...enjoying
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值