`
Dead_knight
  • 浏览: 1200958 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240190
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48914
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236876
社区版块
存档分类
最新评论

Axis源码分析-客户端调用(一)

    博客分类:
  • J2EE
阅读更多
1.手工编码调用服务,如:
            String endPoint = "……";
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endPoint));
            call.setOperation("sendSMPPMsg");
            System.out.println(call.invoke(new Object[]{"aaa","bbb","ccc","ddd","001","ccms"}));

以上代码完成一次接口调用,源码解读
第一步:Service service = new Service();
完成新建服务对象,构造函数为:
    public Service() {
        //获取客户端引擎
        engine = getAxisClient();
    }

    //通过EngineConfiguration构造客户端引擎
    protected AxisClient getAxisClient() {
        return new AxisClient(getEngineConfiguration());
    }

    //获取客户端配置信息
     //EngineConfigurationFactoryFinder.newFactory返回的工厂是:
     //org.apache.axis.configuration.EngineConfigurationFactoryDefault
    //该工厂中getClientEngineConfig()返回的是FileProvider对象
    protected EngineConfiguration getEngineConfiguration() {
        if (this.config == null) {
            this.config = EngineConfigurationFactoryFinder.newFactory().getClientEngineConfig();
        }
        return config;
    }

EngineConfigurationFactoryDefault:
    //EngineConfigurationFactoryDefault中方法
    public EngineConfiguration getClientEngineConfig() {
        return new FileProvider(clientConfigFile);
    }


第二步:Call call = (Call) service.createCall();
    public javax.xml.rpc.Call createCall() throws ServiceException {
        _call = new org.apache.axis.client.Call(this);
        return _call;
    }

新建Call对象时,首先进行初始化
    static {
        initialize();
    }

    public Call(Service service) {
        this.service = service ;
        //service.getEngine()返回AxisClient实例
        AxisEngine engine = service.getEngine();
        //构造MessageContext
        msgContext = new MessageContext( engine );
        myProperties.setParent(engine.getOptions());
        maintainSession = service.getMaintainSession();
    }

    //初始化协议对应的Transport(java/local/http/https)
    public static synchronized void initialize() {
        addTransportPackage("org.apache.axis.transport");

        setTransportForProtocol("java",
                org.apache.axis.transport.java.JavaTransport.class);
        setTransportForProtocol("local",
                org.apache.axis.transport.local.LocalTransport.class);
        setTransportForProtocol("http", HTTPTransport.class);
        setTransportForProtocol("https", HTTPTransport.class);
    }


第三步:call.setTargetEndpointAddress(new java.net.URL(endPoint));
public void setTargetEndpointAddress(java.net.URL address) {
        try {
            if ( address == null ) {
                setTransport(null);
                return ;
            }
            String protocol = address.getProtocol();
            if ( this.transport != null ) {
                String oldAddr = this.transport.getUrl();
                if ( oldAddr != null && !oldAddr.equals("") ) {
                    URL     tmpURL   = new URL( oldAddr );
                    String  oldProto = tmpURL.getProtocol();
                    if ( protocol.equals(oldProto) ) {
                        this.transport.setUrl( address.toString() );
                        return ;
                    }
                }
            }

            // Do we already have a transport for this address?
            Transport transport = service.getTransportForURL(address);
            if (transport != null) {
                setTransport(transport);
            }
            else {
                //org.apache.axis.transport.http.HTTPTransport
                transport = getTransportForProtocol(protocol);
                if (transport == null)
                    throw new AxisFault("Call.setTargetEndpointAddress",
                                 Messages.getMessage("noTransport01",
                                 protocol), null, null);
                transport.setUrl(address.toString());
                setTransport(transport);
                service.registerTransportForURL(address, transport);
            }
        }
        catch( Exception exp ) {
            log.error(Messages.getMessage("exception00"), exp);
        }
    }


第四步:call.setOperation("sendSMPPMsg");
    public void setOperation(String opName) {
        if ( service == null ) {
            throw new JAXRPCException( Messages.getMessage("noService04") );
        }

        this.setOperationName( opName );
        this.setEncodingStyle( null );
        this.setReturnType( null );
        this.removeAllParameters();

        javax.wsdl.Service wsdlService = service.getWSDLService();
        if(wsdlService == null) {
            return;
        }
        …… ……
    }

    public void setOperationName(String opName) {
        operationName = new QName(opName);
    }


第五步:call.invoke(new Object[]{});
public Object invoke(Object[] params) throws java.rmi.RemoteException {
    Object res=this.invoke(operationName.getNamespaceURI(),
                    operationName.getLocalPart(), params);
    ……
}

public Object invoke(String namespace, String method, Object[] args)
                    throws AxisFault {
        if (log.isDebugEnabled()) {
            log.debug("Enter: Call::invoke(ns, meth, args)");
        }

        if (getReturnType() != null && args != null && args.length != 0 && operation.getNumParams() == 0) {
            throw new AxisFault(Messages.getMessage("mustSpecifyParms"));
        }
        //构造参数消息体XML格式
        RPCElement body = new RPCElement(namespace, method, getParamList(args));

        Object ret = invoke( body );

        if (log.isDebugEnabled()) {
            log.debug("Exit: Call::invoke(ns, meth, args)");
        }

        return ret;
    }

public Object invoke( RPCElement body ) throws AxisFault {
        if (log.isDebugEnabled()) {
            log.debug("Enter: Call::invoke(RPCElement)");
        }

        SOAPEnvelope         reqEnv =
                new SOAPEnvelope(msgContext.getSOAPConstants(),
                                 msgContext.getSchemaVersion());
        SOAPEnvelope         resEnv = null ;
        Message              reqMsg = new Message( reqEnv );
        Message              resMsg = null ;
        Vector               resArgs = null ;
        Object               result = null ;

        // Clear the output params
        outParams = new HashMap();
        outParamsList = new ArrayList();

        // Set both the envelope and the RPCElement encoding styles
        try {
            body.setEncodingStyle(getEncodingStyle());
            //设置请求消息
            setRequestMessage(reqMsg);
            //添加请求消息
            reqEnv.addBodyElement(body);
            reqEnv.setMessageType(Message.REQUEST);
            System.out.println(reqMsg.getSOAPPartAsString());
            //调用前不妨打印下请求消息体
            //调用invoke
            invoke();
        } catch (Exception e) {
            entLog.debug(Messages.getMessage("toAxisFault00"), e);
            throw AxisFault.makeFault(e);
        }
        //获取响应消息
        resMsg = msgContext.getResponseMessage();

        if (resMsg == null) {
          if (msgContext.isPropertyTrue(FAULT_ON_NO_RESPONSE, false)) {
            throw new AxisFault(Messages.getMessage("nullResponse00"));
          } else {
            return null;
          }
        }

        resEnv = resMsg.getSOAPEnvelope();
        SOAPBodyElement bodyEl = resEnv.getFirstBody();
        if (bodyEl == null) {
            return null;
        }

        if (bodyEl instanceof RPCElement) {
            try {
                resArgs = ((RPCElement) bodyEl).getParams();
            } catch (Exception e) {
                log.error(Messages.getMessage("exception00"), e);
                throw AxisFault.makeFault(e);
            }

            if (resArgs != null && resArgs.size() > 0) {
                boolean findReturnParam = false;
                QName returnParamQName = null;
                if (operation != null) {
                    returnParamQName = operation.getReturnQName();
                }

                if (!XMLType.AXIS_VOID.equals(getReturnType())) {
                    if (returnParamQName == null) {
                        RPCParam param = (RPCParam)resArgs.get(0);
                        result = param.getObjectValue();
                        outParamStart = 1;
                    } else {
                        findReturnParam = true;
                    }
                }

                for (int i = outParamStart; i < resArgs.size(); i++) {
                    RPCParam param = (RPCParam) resArgs.get(i);

                    Class javaType = getJavaTypeForQName(param.getQName());
                    Object value = param.getObjectValue();

                    if (javaType != null && value != null &&
                           !javaType.isAssignableFrom(value.getClass())) {
                        value = JavaUtils.convert(value, javaType);
                    }

                    if (findReturnParam &&
                          returnParamQName.equals(param.getQName())) {
                        result = value;
                        findReturnParam = false;
                    } else {
                        outParams.put(param.getQName(), value);
                        outParamsList.add(value);
                    }
                }
 
                if (findReturnParam) {
                    Iterator it = outParams.keySet().iterator();
                    while (findReturnParam && it.hasNext()) {
                        QName qname = (QName) it.next();
                        ParameterDesc paramDesc =
                            operation.getOutputParamByQName(qname);
                        if (paramDesc == null) {
                            findReturnParam = false;
                            result = outParams.remove(qname);
                        }
                    }
                }
                if (findReturnParam) {
                    String returnParamName = returnParamQName.toString();
                    throw new AxisFault(Messages.getMessage("noReturnParam",
                                                            returnParamName));
                }
            }
        } else {
            try {
                result = bodyEl.getValueAsType(getReturnType());
            } catch (Exception e) {
                result = bodyEl;
            }

        }

        if (operation != null && operation.getReturnClass() != null) {
            result = JavaUtils.convert(result, operation.getReturnClass());
        }
        return( result );
    }

请求消息体
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <sendSMPPMsg xmlns="">
   <arg0 xsi:type="xsd:string">aaa</arg0>
   <arg1 xsi:type="xsd:string">bbb</arg1>
   <arg2 xsi:type="xsd:string">ccc</arg2>
   <arg3 xsi:type="xsd:string">ddd</arg3>
   <arg4 xsi:type="xsd:string">001</arg4>
   <arg5 xsi:type="xsd:string">ccms</arg5>
  </sendSMPPMsg>
 </soapenv:Body>
</soapenv:Envelope>

public void invoke() throws AxisFault {
        if (log.isDebugEnabled()) {
            log.debug("Enter: Call::invoke()");
        }
        isNeverInvoked  = false;
        Message      reqMsg  = null ;
        SOAPEnvelope reqEnv  = null ;
        //以下为设置MessageContext
        msgContext.reset();
        msgContext.setResponseMessage(null);
        msgContext.setProperty( MessageContext.CALL, this );
        msgContext.setProperty( WSDL_SERVICE, service );
        msgContext.setProperty( WSDL_PORT_NAME, getPortName() );
        if ( isMsg ) {
            msgContext.setProperty( MessageContext.IS_MSG, "true" );
        }

        if (username != null) {
            msgContext.setUsername(username);
        }
        if (password != null) {
            msgContext.setPassword(password);
        }
        msgContext.setMaintainSession(maintainSession);

        if (operation != null) {
            msgContext.setOperation(operation);
            operation.setStyle(getOperationStyle());
            operation.setUse(getOperationUse());
        }

        if (useSOAPAction) {
            msgContext.setUseSOAPAction(true);
        }
        if (SOAPActionURI != null) {
            msgContext.setSOAPActionURI(SOAPActionURI);
        } else {
            msgContext.setSOAPActionURI(null);
        }
        if (timeout != null) {
            msgContext.setTimeout(timeout.intValue());
        }
        msgContext.setHighFidelity(!useStreaming);
        if (myService != null) {
            msgContext.setService(myService);
        } else {
            if (portName != null) {
                msgContext.setTargetService(portName.getLocalPart());
            } else {
                reqMsg = msgContext.getRequestMessage();
                boolean isStream = ((SOAPPart)reqMsg.getSOAPPart()).isBodyStream();
                
                if (reqMsg != null && !isStream) {
                    reqEnv = reqMsg.getSOAPEnvelope();

                    SOAPBodyElement body = reqEnv.getFirstBody();

                    if (body != null) {
                        if ( body.getNamespaceURI() == null ) {
                            throw new AxisFault("Call.invoke",
                                                Messages.getMessage("cantInvoke00", body.getName()),
                                                null, null);
                        } else {
                            msgContext.setTargetService(body.getNamespaceURI());
                        }
                    }
                }
            }
        }
        if (log.isDebugEnabled()) {
            log.debug(Messages.getMessage("targetService",
                    msgContext.getTargetService()));
        }

        Message requestMessage = msgContext.getRequestMessage();
        if (requestMessage != null) {
            try {
                msgContext.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, requestMessage.getProperty(SOAPMessage.CHARACTER_SET_ENCODING));
            } catch (SOAPException e) {
            }
            
            if(myHeaders != null) {
                reqEnv = requestMessage.getSOAPEnvelope();
    
                // If we have headers to insert, do so now.
                for (int i = 0 ; myHeaders != null && i < myHeaders.size() ; i++ ) {
                    reqEnv.addHeader((SOAPHeaderElement)myHeaders.get(i));
                }
            }
        }

        // set up transport if there is one
        if (transport != null) {
            transport.setupMessageContext(msgContext, this, service.getEngine());
        }
        else {
            msgContext.setTransportName( transportName );
        }

        SOAPService svc = msgContext.getService();
        if (svc != null) {
            svc.setPropertyParent(myProperties);
        } else {
            msgContext.setPropertyParent(myProperties);
        }

        if(!invokeOneWay) {
            //使用当前线程调用
            invokeEngine(msgContext);
        } else {
            //异步调用,开启新的线程调用
            invokeEngineOneWay(msgContext);
        }
    }

private void invokeEngine(MessageContext msgContext) throws AxisFault {
        //将当前invoke委托至客户端引擎AxisClient执行
        service.getEngine().invoke( msgContext );
        if (transport != null) {
            transport.processReturnedMessageContext(msgContext);
        }
        Message resMsg = msgContext.getResponseMessage();

        if (resMsg == null) {
          if (msgContext.isPropertyTrue(FAULT_ON_NO_RESPONSE, false)) {
            throw new AxisFault(Messages.getMessage("nullResponse00"));
          } else {
            return;
          }
        }

        /** This must happen before deserialization...
         */
        resMsg.setMessageType(Message.RESPONSE);

        SOAPEnvelope resEnv = resMsg.getSOAPEnvelope();

        SOAPBodyElement respBody = resEnv.getFirstBody();
        if (respBody instanceof SOAPFault) {
            //we got a fault
            if(operation == null ||
                    operation.getReturnClass() == null ||
                    operation.getReturnClass() !=
                        javax.xml.soap.SOAPMessage.class) {
                //unless we don't care about the return value or we want
                //a raw message back
                //get the fault from the body and throw it
                throw ((SOAPFault)respBody).getFault();
            }
        }
    }

AxisClient:
public void invoke(MessageContext msgContext) throws AxisFault {
        String hName = null;
        Handler h = null;
        HandlerChain handlerImpl = null;
        MessageContext previousContext = getCurrentMessageContext();
        try {
            setCurrentMessageContext(msgContext);
            hName = msgContext.getStrProp(MessageContext.ENGINE_HANDLER);
            if (hName != null) {
                h = getHandler(hName);
                if (h != null)
                    h.invoke(msgContext);
                else
                    throw new AxisFault("Client.error",
                            Messages.getMessage("noHandler00",
                                    hName),
                            null, null);
            } else {
                SOAPService service = null;
                msgContext.setPastPivot(false);
                service = msgContext.getService();
                if (service != null) {
                    h = service.getRequestHandler();
                    if (h != null)
                        h.invoke(msgContext);
                }
                if ((h = getGlobalRequest()) != null)
                    h.invoke(msgContext);
                handlerImpl = getJAXRPChandlerChain(msgContext);
                if (handlerImpl != null) {
                    try {
                        if (!handlerImpl.handleRequest(msgContext)) {
                            msgContext.setPastPivot(true);
                        }
                    } catch (RuntimeException re) {
                        handlerImpl.destroy();
                        throw re;
                    }
                }

                if (!msgContext.getPastPivot()) {
                    //hName为http
                    hName = msgContext.getTransportName();
                    //getTransport方法为AxisEngine实现
                    if (hName != null && (h = getTransport(hName)) != null) {
                        try {
                            h.invoke(msgContext);
                        } catch (AxisFault e) {
                            throw e;
                        }
                    } else {
                        throw new AxisFault(Messages.getMessage("noTransport00",
                                hName));
                    }
                }
                
                msgContext.setPastPivot(true);
                if (!msgContext.isPropertyTrue(Call.ONE_WAY)) {
                    if ((handlerImpl != null) &&
                            !msgContext.isPropertyTrue(Call.ONE_WAY)) {
                        try {
                            handlerImpl.handleResponse(msgContext);                            
                        } catch (RuntimeException ex) {
                            handlerImpl.destroy();  // WS4EE 1.1 6.2.2.1 Handler Life Cycle. "RuntimeException" --> destroy handler
                            throw ex;    
                        }                        
                    }

                    /* Process the Global Response Chain */
                    /***********************************/
                    if ((h = getGlobalResponse()) != null) {
                        h.invoke(msgContext);
                    }
                    
                    /* Process the Service-Specific Response Chain */
                    /***********************************************/
                    if (service != null) {
                        h = service.getResponseHandler();
                        if (h != null) {
                            h.invoke(msgContext);
                        }
                    }

                    // Do SOAP Semantics checks here - this needs to be a call
                    // to a pluggable object/handler/something
                    if (msgContext.isPropertyTrue(Call.CHECK_MUST_UNDERSTAND,
                            true)) {
                        checker.invoke(msgContext);
                    }
                }
            }
        } catch (Exception e) {
            // Should we even bother catching it ?
            if (e instanceof AxisFault) {
                throw (AxisFault) e;
            } else {
                log.debug(Messages.getMessage("exception00"), e);
                throw AxisFault.makeFault(e);
            }
        } finally {
            if (handlerImpl != null) {
                handlerImpl.destroy();
            }
            // restore previous state
            setCurrentMessageContext(previousContext);
        }
        if (log.isDebugEnabled()) {
            log.debug("Exit: AxisClient::invoke");
        }
    }

AxisEngine:
    public Handler getTransport(String name) throws AxisFault
    {
        try {
            //config为org.apache.axis.configuration.FileProvider
            return config.getTransport(new QName(null, name));
        } catch (ConfigurationException e) {
            throw new AxisFault(e);
        }
    }

FileProvider:
    public Handler getTransport(QName qname) throws ConfigurationException {
        return deployment.getTransport(qname);
    }

org.apache.axis.deployment.wsdd.WSDDDeployment:
    public Handler getTransport(QName name) throws ConfigurationException {
        WSDDTransport t = (WSDDTransport) transports.get(name);
        if (t != null) {
            return t.getInstance(this);
        }
        return null;
    }


public final Handler getInstance(EngineConfiguration registry)
        throws ConfigurationException
    {
        if (scope == SCOPE_SINGLETON) {
             synchronized (this) {
                if (singletonInstance == null)
                    singletonInstance = getNewInstance(registry);
            }
            return singletonInstance;
        }
        return getNewInstance(registry);
    }

    private Handler getNewInstance(EngineConfiguration registry)
        throws ConfigurationException
    {
        QName type = getType();
        if (type == null ||
            WSDDConstants.URI_WSDD_JAVA.equals(type.getNamespaceURI())) {
            try
            {
            //此处产生实例交给子类WSDDTargetedChain实现
            Handler ha = makeNewInstance(registry);
            return ha;
            }
            catch(Exception e)
            {
                e.printStackTrace();
                return null;
            }

        } else {
            return registry.getHandler(type);
        }
    }

WSDDTargetedChain:
 public Handler makeNewInstance(EngineConfiguration registry)
        throws ConfigurationException
    {
        Handler reqHandler = null;

        WSDDChain req = getRequestFlow();
        if (req != null)
            reqHandler = req.getInstance(registry);
        
        Handler pivot = null;
        if (pivotQName != null) {
            if (URI_WSDD_JAVA.equals(pivotQName.getNamespaceURI())) {
                try {
                    //此处的枢纽Handler为client包下的client-config.wsdd配置中的http Transport即:java:org.apache.axis.transport.http.HTTPSender
                    pivot = (Handler)ClassUtils.forName(pivotQName.getLocalPart()).newInstance();
                } catch (InstantiationException e) {
                    throw new ConfigurationException(e);
                } catch (IllegalAccessException e) {
                    throw new ConfigurationException(e);
                } catch (ClassNotFoundException e) {
                    throw new ConfigurationException(e);
                }
            } else {
                pivot = registry.getHandler(pivotQName);
            }
        }
        
        Handler respHandler = null;
        WSDDChain resp = getResponseFlow();
        if (resp != null)
            respHandler = resp.getInstance(registry);
        //返回SimpleTargetedChain
        Handler retVal = new org.apache.axis.SimpleTargetedChain(reqHandler, pivot,respHandler);
        retVal.setOptions(getParametersTable());
        return retVal;
    }

SimpleTargetedChain:
    public SimpleTargetedChain(Handler reqHandler, Handler pivHandler,
                               Handler respHandler) {
        init(reqHandler, null, pivHandler, null, respHandler);
    }
    //初始化Handler链:请求requestHandler、响应responseHandler、枢纽pivotHandler(此处为client-config.wsdd中配置的<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>)
    protected void init(Handler reqHandler, Handler specialReqHandler,
                        Handler pivHandler, Handler specialRespHandler,
                        Handler respHandler) {

        requestHandler = reqHandler;
        if (requestHandler != null)
            addHandler(requestHandler);

        if (specialReqHandler != null)
            addHandler(specialReqHandler);

        pivotHandler = pivHandler;
        if (pivotHandler != null) {
            addHandler(pivotHandler);
            addHandler(new PivotIndicator());
        }

        if (specialRespHandler != null)
            addHandler(specialRespHandler);

        responseHandler = respHandler;
        if (responseHandler != null)
            addHandler(responseHandler);
    }


回到AxisClient中的
                    if (hName != null && (h = getTransport(hName)) != null) {
                        try {
                            //h为:org.apache.axis.SimpleTargetedChain
                            h.invoke(msgContext);
                        } catch (AxisFault e) {
                            throw e;
                        }
                    } 

SimpleTargetedChain的invoke是由父类SimpleChain实现
    public void invoke(MessageContext msgContext) throws AxisFault {
       invoked = true;
       doVisiting(msgContext, iVisitor);
   }

    //visitor为InvocationStrategy
    private void doVisiting(MessageContext msgContext,
                            HandlerIterationStrategy visitor) throws AxisFault {
        int i = 0 ;
        try {
            Enumeration enumeration = handlers.elements();
            while (enumeration.hasMoreElements()) {
                //循环Handler链,对每个handler都进行迭代
                Handler h = (Handler)enumeration.nextElement();
                visitor.visit(h, msgContext);
                i++;
            }
        } catch( AxisFault f ) {
        ……
        }
    }


public class InvocationStrategy implements HandlerIterationStrategy {
    public void visit(Handler handler, MessageContext msgContext)
            throws AxisFault {
        //实际上是调用每个注册的Handler的invoke方法
        handler.invoke(msgContext);
    }
}

此处为client-config.wsdd中配置的<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
即枢纽Handler类:HTTPSender
public void invoke(MessageContext msgContext) throws AxisFault {
        SocketHolder socketHolder = new SocketHolder(null);
        try {
            BooleanHolder useFullURL = new BooleanHolder(false);
            StringBuffer otherHeaders = new StringBuffer();
            targetURL = new URL(msgContext.getStrProp(MessageContext.TRANS_URL));
            String host = targetURL.getHost();
            int port = targetURL.getPort();
            //writeToSocket完成Http请求头设置、Socket工厂产生Socket对象
              //向socket输出流添加http请求头以及请求消息体XML格式
            InputStream inp = writeToSocket(socketHolder, msgContext, targetURL,otherHeaders, host, port, msgContext.getTimeout(), useFullURL);
            Hashtable headers = new Hashtable();
            //向socket输入流添加http响应头
            inp = readHeadersFromSocket(socketHolder, msgContext, inp, headers);
            //向socket输入流添加响应消息体XML格式
            readFromSocket(socketHolder, msgContext, inp, headers);
        } catch (Exception e) {
            log.debug(e);
            try {
	            if (socketHolder.getSocket() != null ) {
	            	socketHolder.getSocket().close();
	            }
            } catch (IOException ie) {
            	// we shouldn't get here.
            }
            throw AxisFault.makeFault(e);
        }
    }

以下为打印的header信息:
POST /frameweb/SmsSendService.jws?wsdl HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/#axisVersion#
Host: 10.70.85.91:7001
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 600

以下为返回响应信息:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<sendSMPPMsgResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sendSMPPMsgReturn xsi:type="xsd:string">&#x53D1;&#x9001;&#x6210;&#x529F;</sendSMPPMsgReturn>
</sendSMPPMsgResponse>
</soapenv:Body>
</soapenv:Envelope>


至此,能大概对完成一次Webservice调用有个清晰的了解。
实际上,调用的底层采用socket发送http请求+xml消息(Message)。
我可以直接通过socket调用Webservice服务,代码如下:
        Socket socket = null;
        OutputStream out = null;
        try
        {
            socket = getSocket("192.168.1.110", 8888, 20000);
            out = socket.getOutputStream();
            out = new BufferedOutputStream(out, 8 * 1024);
            String header = "POST /axis/services/Version?wsdl HTTP/1.0\n" +
                    "Content-Type: text/xml; charset=utf-8\n" +
                    "Accept: application/soap+xml, application/dime, multipart/related, text/*\n" +
                    "User-Agent: Axis/#axisVersion#\n" +
                    "Host: localhost:8888\n" +
                    "Cache-Control: no-cache\n" +
                    "Pragma: no-cache\n" +
                    "SOAPAction: \"\"\n" +
                    "Content-Length: 291\n\n";
            System.out.println(header);
            out.write(header.toString()
                    .getBytes("iso-8859-1"));
            Writer writer = new OutputStreamWriter(out, "UTF-8");
            writer = new BufferedWriter(new PrintWriter(writer));

            String req = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                    "\n <soapenv:Body>\n" +
                    "  <getVersion xmlns=\"\"/>\n" +
                    " </soapenv:Body>\n" +
                    "</soapenv:Envelope>";
            System.out.println(req);
            System.out.println(req.length());
            writer.write(new String(req.getBytes("iso-8859-1")));
            writer.flush();

            out.flush();
            BufferedReader reader = new BufferedReader (
                    new InputStreamReader
                    (socket.getInputStream()
                    ));
            String line;
            while((line = reader.readLine()) != null) 
            {
                System.out.println(line);
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
                out.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }

分享到:
评论
1 楼 wupuyuan 2011-08-29  
总结的不错,欢迎去我空间看看!

相关推荐

    axis-src-1_3.zip_axis_axis-src-1_3_axis1 1.3 src_axis源码

    通过对这些模块的源码分析,我们可以了解 Axis 如何处理 SOAP 消息、解析 WSDL 文件、生成 Java 代码等关键操作。 1. Core 模块:这是 Axis 的核心部分,包括了 SOAP 消息的处理、WSDL 解析、服务注册等功能。其中...

    axis开发JAX-RPC webservice

    8. **客户端生成**:Axis可以从WSDL生成Java客户端代码,使得调用Web服务如同调用本地方法一样简单。 9. **异常处理**:在服务端和客户端,都需要考虑Web服务调用可能出现的异常,并进行适当的处理。 10. **测试...

    axis2-----版本为1.6.2的webservice发布总结。

    标题中的“axis2-----版本为1.6.2的webservice发布总结”指的是Apache Axis2,这是一个用Java编写的Web服务框架,用于创建和部署Web服务。版本1.6.2是该框架的一个特定发行版,它包含了修复的错误、性能优化以及可能...

    axis2-1.7.4-src.zip 源码

    通过深入学习和分析“axis2-1.7.4-src.zip”的源码,开发者可以更好地掌握Web服务的核心技术和Apache Axis2的高级特性,为构建高效、可靠的Web服务应用打下坚实基础。同时,源码学习也能帮助开发者解决实际开发中...

    axis1.4源码

    Axis1.4源码分析 Axis是Apache软件基金会的一个开源项目,它是一个基于Java的Web服务框架,专门用于实现SOAP(简单对象访问协议)和WSDL(Web服务描述语言)。Axis1.4是该框架的一个稳定版本,为开发人员提供了构建...

    WebService框架整理(一) Axis1

    5. **源码分析**: Axis1的源码可以帮助开发者更深入地理解其内部工作原理,例如如何解析SOAP消息,如何绑定Java方法到SOAP操作等。对于高级开发者,可以通过阅读源码来定制或扩展Axis1的功能。 6. **工具的使用**...

    Axis WebService 实例源码

    本实例将探讨如何在Tomcat服务器上使用Axis来实现一个简单的WebService,并通过具体的源码分析加深理解。 【描述】中提到的"Tomcat+Axis+WebService 入门实例"旨在帮助初学者掌握如何利用这些组件进行通信。首先,...

    axis2源码下载~

    在进行源码分析之前,首先需要从官方网站或者其他可靠的源获取Axis2的源码。下载版本为1.5.4,这个版本可能相对较为古老,但依然包含了大量Web服务实现的核心概念和技术。解压下载的压缩包,通常会包含多个目录和...

    axis-1.4_1.jar.zip

    标题 "axis-1.4_1.jar.zip" 暗示了这是一个包含Axis 1.4版本源码的压缩文件,轴(Axis)是Apache软件基金会的一个开源项目,主要用于构建Web服务。它是一个SOAP(简单对象访问协议)引擎,允许开发者在Java平台上...

    手写axis实现webservice通讯

    在IT行业中,Web服务是一种基于互联网的标准协议,用于应用程序之间的通信。XML(可扩展标记语言)和SOAP(简单对象访问协议)...在实际项目中,结合源码分析和工具使用,可以更好地掌握Web服务的核心技术和最佳实践。

    axis.jar源码

    源码的分析对于开发者来说,不仅可以帮助理解其内部工作原理,也能提升自身在Web服务开发中的技术水平。 一、 Axis.jar概览 Axis.jar作为Web服务客户端和服务器端的核心库,包含了处理SOAP消息、WSDL(Web服务描述...

    Java动态调用webService,axis2动态调用webService

    Axis2是Apache软件基金会开发的一个Web服务框架,它提供了动态调用Web服务的能力。本文将深入探讨如何使用Axis2来动态地调用Web Service,并通过分析`WebServiceInvoker.java`这个文件来理解其实现原理。 1. **Java...

    WebService -AXIS工程

    6. 源码分析: 在"webserviceadapter"这个文件中,可能包含了AXIS生成的源码,包括服务端的部署文件、Java接口或实现类,以及客户端的调用代理类。通过查看这些源码,我们可以理解AXIS如何将业务逻辑转化为Web服务...

    axis1.1源码

    Axis1.1源码分析 Axis是一个开源的Web服务框架,它基于Java语言,由Apache软件基金会开发并维护。在电子商务、企业应用集成(EAI)以及B2B交互等场景中,Axis扮演了关键角色,因为它允许开发者轻松地创建、部署和...

    webservice服务器端和客户端源码

    四、源码分析 在压缩包中的"webservice源码"可能包括以下几个部分: 1. 服务端接口:定义Web服务提供的操作,通常是一个Java接口,方法名对应WSDL中的操作。 2. 服务端实现:实现服务端接口,处理实际业务逻辑。 3. ...

    axis2_source

    【标题】"Axis2 源码分析" 【描述】"Axis2是Apache软件基金会开发的一个开放源码的Web服务引擎,它提供了完整的SOAP和WS-*实现。这个压缩包包含了Axis2的源代码,适用于开发者深入理解其内部机制、进行二次开发或者...

    my axis

    6. **API使用**:Axis提供了一系列API,如AxisClient,用于客户端调用Web服务,以及Service和Deployer接口,用于服务的创建和部署。 7. **版本兼容性**:Axis有多个版本,每个版本可能对Java版本、其他依赖库有不同...

Global site tag (gtag.js) - Google Analytics