ofbiz的服务(service)export成web service的方法(3)

Mail
用axis调用服务

通过修改昨天说的ofbiz的源代码后,createPerson终于能够访问到WSDL的文件了,下一步就是编写客户端来调用了。
我们使用axis1.4来编写客户端,代码如下:
 
  1. package testClientSoap;
  2. import java.util.*;
  3. import java.net.*;
  4. import java.rmi.*;
  5. import javax.xml.namespace.*;
  6. import javax.xml.rpc.*;
  7. //import javax.wsdl.OperationType;
  8. import org.apache.axis.Message;
  9. import org.apache.axis.encoding.XMLType;
  10. import org.apache.axis.message.RPCElement;
  11. import org.apache.axis.message.RPCParam;
  12. import org.apache.axis.message.SOAPEnvelope;
  13. import org.apache.axis.client.Call;
  14. import org.apache.axis.client.Service;
  15. import org.apache.axis.utils.*;
  16. public class TestCreatePerson {
  17.  
  18.  private static Map getResponseParams(Message respMessage) {
  19.         Map mRet = new Hashtable();
  20.         try {
  21.             SOAPEnvelope resEnv = respMessage.getSOAPEnvelope();
  22.             List bodies = resEnv.getBodyElements();
  23.             Iterator i = bodies.iterator();
  24.             while (i.hasNext()) {
  25.                 Object o = i.next();
  26.                 if (o instanceof RPCElement) {
  27.                     RPCElement body = (RPCElement) o;
  28.                     List params = null;
  29.                     params = body.getParams();
  30.                     Iterator p = params.iterator();
  31.                     while (p.hasNext()) {
  32.                         RPCParam param = (RPCParam) p.next();
  33.                         mRet.put(param.getName(), param.getValue());
  34.                        
  35.                         System.out.println("SOAP Client Param - " + param.getName() + "=" + param.getValue());
  36.                     }
  37.                 }
  38.             }
  39.         } catch (org.apache.axis.AxisFault e) {
  40.          System.out.println("AxisFault");
  41.         } catch (org.xml.sax.SAXException e) {
  42.          System.out.println("SAXException");
  43.         }
  44.         return mRet;
  45.     }
  46.    
  47.     public static void main(String[] args) {
  48.        
  49.         String message = "";
  50.         Map output;
  51.         ArrayList outputList;
  52.         String responseMessage,firstName,lastName,endpoint;
  53.    
  54.     try {
  55.         endpoint = "http://127.0.0.1:1234/webtools/control/SOAPService/";
  56.         Call call = (Call) new Service().createCall();
  57.         call.setTargetEndpointAddress(new URL(endpoint));
  58.         call.setOperationName(new QName("createPerson""createPerson"));
  59.         call.addParameter("firstName",
  60.                           org.apache.axis.Constants.XSD_STRING,
  61.                           javax.xml.rpc.ParameterMode.IN);
  62.         call.addParameter("middleName",
  63.                 org.apache.axis.Constants.XSD_STRING,
  64.                 javax.xml.rpc.ParameterMode.IN);
  65.         call.addParameter("lastName",
  66.                 org.apache.axis.Constants.XSD_STRING,
  67.                 javax.xml.rpc.ParameterMode.IN);
  68.         call.addParameter("comments",
  69.                 org.apache.axis.Constants.XSD_STRING,
  70.                 javax.xml.rpc.ParameterMode.IN);
  71.         call.setReturnType(org.apache.axis.Constants.XSD_STRING);
  72.         Object responseWS = call.invoke(new Object[]{"admin""ofbiz""John""A""Tower""WOWOWO"});
  73.         System.out.println( "Receiving response: " +  (String) responseWS);
  74.         output = call.getOutputParams();
  75.         getResponseParams(call.getMessageContext().getResponseMessage());
  76.     } catch (MalformedURLException ex) {
  77.         message = "error: wrong url";
  78.     } catch (ServiceException ex) {
  79.         message = "error: failed to create the call";
  80.     } catch (RemoteException ex) {
  81.         message = "error: failed to invoke WS";
  82.     } finally {
  83.       System.out.println("");
  84.       System.out.println(message);
  85.     }
  86.   }
  87. }    

 
编译运行这个代码,可以很顺利的调用成功。不要高兴的太早,注意到了吗?createPerson的service的auth属性,是false的,意思是说,调用createPerson这个类,是不需要通过ofbiz认证的,
但是我们看一下service.xml文件,很多的service是需要认证的,那么我们把createPerson的auth改成true,重启一下ofbiz,用浏览器访问wsdl文件,没有问题,再运行上面的程序,程序抛出RemoteException这个异常
通过看服务端的日志,的确是没有认证导致的。
怎么解决呢?很简单,我们把input参数增加两个
 
  1.         call.addParameter("login.username",
  2.                 org.apache.axis.Constants.XSD_STRING,
  3.                 javax.xml.rpc.ParameterMode.IN);
  4.         call.addParameter("login.password",
  5.                 org.apache.axis.Constants.XSD_STRING,
  6.                 javax.xml.rpc.ParameterMode.IN);

login.username和login.password这两个参数加到input里面,再编译一下上面的客户端程序,呵呵,成功了!
 
 
我们再测试一下,把createPerson的auth改回false,重启一下ofbiz,再运行一下上面的客户端程序,依然能成功。
那么我们基本上可以得出一个结论,只要把login.username和login.password加到输入参数里面,无论auth为true或者false,都能通吃。
 
 

你可能感兴趣的:(apache,Web,xml,浏览器,SOAP)