龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

使用Java客户端类调用c# WebService和xml rpc server

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
本文介绍一个非常实用的Java客户端工具类来调用C# WebServices和apache XML rpc server,这个类的源码是从网上下载的,我在博客网做项目的时候一直使用这个类来调试C# WebServices和MetaWeblog AP

  本文介绍一个非常实用的Java客户端工具类来调用C# WebServices和apache XML rpc server,这个类的源码是从网上下载的,我在博客网做项目的时候一直使用这个类来调试C# WebServices和MetaWeblog API。顺便在这里也给大家介绍一下C#如何处理此类发送的xml数据。
  使用这个类不用安装任何第三方工具,因为采用http的方式发送xml文件,所以你只需要安装好JDK就可以了。执行此类还可以获得WebServices或xml rpc server返回的xml字符流,你可以根据返回的xml数据来进行其他程序处理。通过这种方式实现了Java平台和.NET平台的数据交换和WebService调用。
  下面是此类的源代码SOAPClient4XG.java:
  
  /**
   * SOAPClient4XG. Read the SOAP envelope file passed as the second
   * parameter, pass it to the SOAP endpoint passed as the first parameter, and
   * print out the SOAP envelope passed as a response. with help from Michael
   * Brennan 03/09/01
   *
   *
   * @author Bob DUCharme
   * @version 1.1
   * @param SOAPUrl URL of SOAP Endpoint to send request.
   * @param xmlFile2Send A file with an XML document of the request.
   *
   * 5/23/01 revision: SOAPAction added
  */
  
  import java.io.*;
  import java.net.*;
  
  public class SOAPClient4XG {
   public static void main(String[] args) throws Exception {
  
   if (args.length < 2) { //小于
   System.err.println("Usage: java SOAPClient4XG " +
   "http://soapURL soapEnvelopefile.xml" +
   " [SOAPAction]");
   System.err.println("SOAPAction is optional.");
   System.exit(1);
   }
  
   String SOAPUrl = args[0];
   String xmlFile2Send = args[1];
  
   String SOAPAction = "";
   if (args.length > 2) //大于
   SOAPAction = args[2];
  
   // Create the connection where we're going to send the file.
   URL url = new URL(SOAPUrl);
   URLConnection connection = url.openConnection();
   HttpURLConnection httpConn = (HttpURLConnection) connection;
  
   // Open the input file. After we copy it to a byte array, we can see
   // how big it is so that we can set the HTTP Cotent-Length
   // property. (See complete e-mail below for more on this.)
  
   FileInputStream fin = new FileInputStream(xmlFile2Send);
  
   ByteArrayOutputStream bout = new ByteArrayOutputStream();
  
   // Copy the SOAP file to the open connection.
   copy(fin,bout);
   fin.close();
  
   byte[] b = bout.toByteArray();
  
   // Set the appropriate HTTP parameters.
   httpConn.setRequestProperty( "Content-Length",
   String.valueOf( b.length ) );
   httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
   httpConn.setRequestProperty("SOAPAction",SOAPAction);
   httpConn.setRequestMethod( "POST" );
   httpConn.setDoOutput(true);
   httpConn.setDoInput(true);
  
   // Everything's set up; send the XML that was read in to b.
   OutputStream out = httpConn.getOutputStream();
   out.write( b );
   out.close();
  
   // Read the response and write it to standard out.
  
   InputStreamReader isr =
   new InputStreamReader(httpConn.getInputStream());
   BufferedReader in = new BufferedReader(isr);
  
   String inputLine;
  
   while ((inputLine = in.readLine()) != null)
   System.out.println(inputLine);
  
   in.close();
   }
  
   // copy method from From E.R. Harold's book "Java I/O"
   public static void copy(InputStream in, OutputStream out)
   throws IOException {
  
   // do not allow other threads to read from the
   // input or write to the output while copying is
   // taking place
  
   synchronized (in) {
   synchronized (out) {
  
   byte[] buffer = new byte[256];
   while (true) {
   int bytesRead = in.read(buffer);
   if (bytesRead == -1) break;
   out.write(buffer, 0, bytesRead);
   }
   }
   }
   }
  }
  
  编译:javac SOAPClient4XG.java
  运行的命令格式: java -classpath . SOAPClient4XG http://localhost/BokeServices/Service1.asmx c:loginReq.xml http://tempuri.org/UserLoginReq,不过先不要运行上面的命令,先介绍一下命令行的意思,http://localhost/BokeServices/Service1.asmx是C# WebService的地址,c:loginReq..xml里的内容是调用的WebService方法的xml文件, http://tempuri.org是WebService方法的命名空间,一定要有,否则调用失败,假如你在C# WebServices中使用了方法默认的命名空间的话,就使用http://tempuri.org,否则要与C#中定义的一致,UserLoginReq是C# WebServices的方法名。
  
精彩图集

赞助商链接