作者:王恩建來源:http://www.sentom.NetXML-RPC 是工作在 Internet 上的遠程過程調用協議。通俗點講,就是使用 HTTP 協議交互,交互的載體是 XML 文件。XML-RPC 具體的規范說 明請參考這裡。
圖片來自XML-RPC官方網站
XML-RPC 規范定義了六種數據類型,下表是這六種數據類型與 Java 的數據類型對應表。
XML-RPCJava
XML-RPC 規范的各種平台都有具體實現,XML-RPC 規范的 Java 實現都有好幾種,這裡我們選擇了 apache XML-RPC。
XML-RPC 服務端實現先定義一個簡單業務對象 MyHandler,遠程客戶端將調用該對象的方法,具體代碼如下:
package net.sentom.XMLrpc;public class MyHandler {public String sayHello(String str){return "Hello," + str;}}
然後定義一個 Servlet 名叫 MyXMLRpcServer,遠程客戶端通過 HTTP-POST 訪問該 Servlet。
package net.sentom.XMLrpc;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import Javax.servlet.http.HttpServletResponse;import org.apache.xmlrpc.XmlRpcServer;public class MyXmlRpcServer extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {XmlRpcServer xmlrpc = new XmlRpcServer();xmlrpc.addHandler("myHandler", new MyHandler());byte[] result = xmlrpc.execute(request.getInputStream());response.setContentType("text/XML");response.setContentLength(result.length);OutputStream out = response.getOutputStream();out.write(result);out.flush();}}
需要特別說明是:
XMLrpc.addHandler("myHandler", new MyHandler());
為了便於理解,這裡可以看成普通的:
MyHandler myHandler = new MyHandler();
最後在web.XML文件中加入以下幾行:
XML-RPC 客戶端實現客戶端相對簡單一些,先來一個 Java 客戶端實現 MyXMLRpcClIEnt:
package net.sentom.XMLrpc;import java.io.IOException;import Java.Net.MalformedURLException;import Java.util.Vector;import org.apache.xmlrpc.XmlRpcClIEnt;import org.apache.xmlrpc.XmlRpcException;public class MyXmlRpcClient {public static void main(String[] args) {try {XmlRpcClient xmlrpc = new XmlRpcClIEnt("http://localhost:8080/XMLRPC/MyXmlRpcServer");Vector params = new Vector();params.addElement("Tom");String result = (String) xmlrpc.execute("myHandler.sayHello",params);System.out.println(result);} catch (MalformedURLException e) {System.out.println(e.toString());} catch (XMLRpcException e) {System.out.println(e.toString());} catch (IOException e) {e.printStackTrace();}}
http://localhost:8080/XMLRPC/MyXmlRpcServer 為 MyXMLRpcServer 的訪問URL。
String result = (String) XMLrpc.execute("myHandler.sayHello",params);
再來一個 Python 客戶端實現
import xmlrpcliburl = 'http://localhost:8080/XMLRPC/MyXmlRpcServer';server = XMLrpclib.Server(url);print server.myHandler.sayHello('Tom');