最近在做一个系统,我们只做服务端,客户来调用我们的服务,系统需求是这样的:
   通过SOAP协议完成对接,并将SOAP协议与HTTP绑定,即通过HTTP POST将SOAP通信报文发送到服务端,服务端将通信结果返回至客户端,中间是通过web service服务来完成交互的。
SOAP报文将采用如下结构:
       
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"/>
           <SOAP-ENV:Body>
               <m:functionName xmlns:m="www.yuanzhish.cn">
                  <DocumentRoot>
                      .....
                  </DocumentRoot>
               </m:functionName>
           </SOAP-ENV:Body>
</SOAP-ENV:Envelope>其中,functionName为交易功能名称,如:getPrice表示得到服务器价格。
节点DocumentRoot为相应功能通信报文的文档根节点,以得到服务器当前价格为例,如果通信报文为:
   
 <?xml version='1.0' encoding="GB2312">
    <Transaction>
       <money>RMB</money>
    </Transaction>则,通信SOAP报文 为:       <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"/>
           <SOAP-ENV:Body>
               <m:getPrice xmlns:m="www.yuanzhish.cn">
                 <?xml version='1.0' encoding="GB2312">
                 <Transaction>
                   <money>RMB</money>
                 </Transaction>
               </m:getPrice>
           </SOAP-ENV:Body>
       </SOAP-ENV:Envelope>
现在我需要做一个服务端,解释客户传过来的SOAP协议内容,并将处理结果以SOAP协议的内容返回。我下载了一个soap-2_3_1包,有用过这个包的,并有实践经验的大虾们帮忙,看如何编写服务端程序,包括报文解释,报文返回。非常感谢。分数不够我还可以加,直到问题解决完为止,大家一块来帮忙吧,小弟第一次搞这个网上看了很多资料,都不是我想要的,最好有一位在线帮忙的老师哈,我是北京的,如果帮忙解决问题,俺请你吃饭~~~~

解决方案 »

  1.   

    没用过,一般我都是用axis直接写对象就可以了,然后发布wsdl给客户端,没有自己去固定格式什么的,一切开发都是面向对象
      

  2.   

    1,services.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service>
    <name>user</name>
    <serviceClass>cn.sh.ideal.app.IUser</serviceClass>
    <implementationClass>
    cn.sh.ideal.app.UserImpl
    </implementationClass>
    <style>wrapped</style>
    <use>literal</use>
    <scope>application</scope>
    </service>
    </beans>
      

  3.   

    2,services.xml所对应的UserImpl类:package cn.sh.ideal.app;public class UserImpl implements IUser {
    protected final Log log = LogFactory.getLog(this.getClass());
    static IUserDAO userDAO;
    static IRightActionDAO rightActionDAO;
    static IUserQueueDAO userQueueDAO ;
    static ISortDAO sortDAO; public static void main(String args[]) {
    UserImpl u=new UserImpl();
    System.out.println(u.encrypt("88888"));
    }

    /** MD5加密 */
    public String encrypt(String pwd){
    try {
         byte[] btInput = pwd.getBytes();
         MessageDigest mdInst = MessageDigest.getInstance("MD5");
         mdInst.update(btInput);
         byte[] md = mdInst.digest();
         StringBuffer sb = new StringBuffer();
         for (int i = 0; i < md.length; i++) {
          int val = ((int) md[i]) & 0xff;
          if (val < 16){
           sb.append("0");
          }        
          sb.append(Integer.toHexString(val));     
         }
         return sb.toString();
        } catch (Exception e) {
         return null;
        }
    } public LoginUser login(String name,String pwd,String rightId) {

    TSysUser user1=new TSysUser();
    user1.setUserName(name);
    user1.setPwd(pwd);

    System.out.println("userDAO:"+userDAO);
    System.out.println("rightActionDAO:"+rightActionDAO);
    TSysUser user=(TSysUser)userDAO.getInfo(user1);

    TRightAction tRightAction=new TRightAction();
    tRightAction.setRightId(rightId);
    LoginUser loginUser =new LoginUser();
    if(user!=null){
    loginUser.setUserId(user.getUserId());
    loginUser.setPwd(user.getPwd());
    loginUser.setWorkId(user.getWorkId());
    loginUser.setUserName(user.getUserName());
    loginUser.setRealName(user.getRealName());
    loginUser.setAreaId(user.getAreaId());
    loginUser.setErrorUrl(null);

    if(!pwd.equalsIgnoreCase(this.encrypt(user.getPwd()))){
    // 密码失败
    loginUser.setFlag("2");
    }else{
    // 验证通过
    // 1,获取action
    List list=rightActionDAO.getList(tRightAction);
    if(list!=null&&list.size()>0){
    String action="";
    for(int i=0;i<list.size();i++){
    if(i==list.size()-1){
    action+=((TRightAction)list.get(i)).getActionId().trim();
    }else{
    action+=((TRightAction)list.get(i)).getActionId().trim()+",";
    }
    }
    loginUser.setAction(action);
    }
    // 2,获取队列queue
    TSysUserqueue tsuq=new TSysUserqueue();
    tsuq.setUserId(user.getUserId());
    List queueList=userQueueDAO.getList(tsuq);
    log.info("queue'size:"+queueList.size());
    loginUser.setQueuelist(queueList);

    // 3,获取分类
    List sortList=sortDAO.getList(user);
    log.info("sort'size:"+sortList.size());
    loginUser.setSortList(sortList);
    }
    }else{
    // 用户名不存在
    loginUser.setUserName(name);
    loginUser.setPwd(pwd);
    loginUser.setFlag("1");
    }

    return loginUser;
    } public  void setUserDAO(IUserDAO userDAO) {
    UserImpl.userDAO = userDAO;
    } public  void setRightActionDAO(IRightActionDAO rightActionDAO) {
    UserImpl.rightActionDAO = rightActionDAO;
    } public  void setUserQueueDAO(IUserQueueDAO userQueueDAO) {
    UserImpl.userQueueDAO = userQueueDAO;
    } public  ISortDAO getSortDAO() {
    return sortDAO;
    } public  void setSortDAO(ISortDAO sortDAO) {
    UserImpl.sortDAO = sortDAO;
    }
    }
      

  4.   

     3,简单测试类:package cn.sh.ideal.app;import java.net.MalformedURLException;import org.codehaus.xfire.XFireFactory;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.service.binding.ObjectServiceFactory;import cn.sh.ideal.ibatis.bean.LoginUser;/**
     * @version V1.0
     * @author YuLin.Yang
     * @date 2009-4-21
     */
    public class Test {
    public Test () {

    }
    public static void main(String args[]) { Service srvcModel = new ObjectServiceFactory().create(IUser.class);
    XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    // 这个url是webservice部署之后启动的url
    String testUrl = "http://localhost:8087/zjservice/services/user";
    try { IUser srvc = (IUser) factory.create(srvcModel, testUrl);
    //System.out.println(srvc);
    LoginUser b = srvc.login("88888","1c395a8dce135849bd73c6dba3b54809","2");
    System.out.println(b.getQueuelist().size());
    //System.out.print(b ); } catch (MalformedURLException e) {
    e.printStackTrace();
    }
    }}
      

  5.   

    感谢oraclelogan的帮忙,我明天去试一下。
    另外,我想要的是SOAP解释器的代码,有谁有吗?就是如何通过服务器端的servlet接收到SOAP协议传送过来的报文,根据报文进行解释,并将处理结果再次打包成SOAP协议的形式,response给客户端。有谁用过SOAP 2.3.1这个版本的东西???
      

  6.   

    推荐使用soapUI这个工具测试webservice...
    咱没技术,先用工具!
      

  7.   

    1)创建SOAP连接
    SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
    SOAPConnection sc = scf.createConnection();
    2)创建消息工厂
    MessageFactory msgFactory = MessageFactory.newInstance();
    3)创建消息
    SOAPMessage message = msgFactory.createMessage();
    4)填充SOAP消息
    添加SOAP的Header、Body、Namespace等信息。
    5)添加SOAP附件
    URL url1 = new URL(“文件路径”);
    DataHandler.dataHandler = new DataHandler(url);
    Message.addAttachmentPart(
               messgage.createAttachmentPart(dataHandler));
    6)保存SOAP消息
    message.saveChanges();
    7)发送消息并接收响应
    String url = “URL路径”;
    SOAPMessage response = sc.call(message,url);
    if(response!=null){
         //do something
            }else{
         //出错处理
             }
    8)关闭连接
    sc.close();
    不过,有些不太常见的服务,可能需要设置SOAPAction,不然的话会收到NoSOAPAction的错误返回消息,其实现代码如下:
    MimeHeaders mimeHeaders = message.getMimeHeaders();
    mimeHeaders.setHeader("SOAPAction", "your action url");
      

  8.   

    realrealdragon 大哥能否给出实际的代码??我这边只能调用现成的SOAP架包的东西。还有,你这是客户端程序,那服务器端如何处理呢???
      

  9.   


    soapUI 加tcptrace soap开发调测之利器。哈哈
      

  10.   

    一句话,用一个开源协议栈就可以完成你所有的事情:Axis、Axis2、CXF、XFire、JAXWS......
      

  11.   

    最近发现我需要自己开发服务端程序,也就是需要使用jaxm-api.jar中的东西,但布署后发现不能访问,有用过这个的吗?代码如下:
    package server;import javax.xml.messaging.JAXMServlet; 
    import javax.xml.messaging.ReqRespListener; 
    import javax.xml.soap.MessageFactory; 
    import javax.servlet.ServletException; 
    import javax.xml.soap.SOAPMessage; 
    import javax.xml.soap.SOAPEnvelope; 
    import javax.servlet.ServletConfig; 
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;public class JAXMReceiveServlet extends JAXMServlet implements ReqRespListener{ 
    static MessageFactory mf=null; 
    //创建一个消息工厂 
    static{ 
      try{ 
       mf=MessageFactory.newInstance(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
    }; public void init(ServletConfig sc) throws ServletException{ 
      super.init(sc); 

    public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws IOException ,ServletException{

    System.out.println("test1");





    }//处理传过来的SOAP消息,并返回一个SOAP消息 
    public SOAPMessage onMessage(SOAPMessage msg){ 
      SOAPMessage resp=null; 
      try{ 
       System.out.println("传入的消息:"); 
       msg.writeTo(System.out); 
       
       //创建一个返回消息 
       resp=mf.createMessage(); 
       SOAPEnvelope se=resp.getSOAPPart().getEnvelope(); 
       se.getBody().addChildElement( 
        se.createName("ResponseMessage")).addTextNode("Received Message,Thanks"); 
        
       return resp; 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      
      return resp; 


    web.xml如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Myweb</display-name>
    <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>test.MyServlet</servlet-class>
    </servlet>
    <servlet>
    <servlet-name>StudentInfoServlet</servlet-name>
    <servlet-class>server.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/servlet/MyServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name>StudentInfoServlet</servlet-name>
    <url-pattern>/StudentInfoServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
    <welcome-file>Login.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
      

  12.   

    一直报404的错误,不知道是容器不兼容的问题还是架包的问题。
    jaxm-api.jar
    jaxm-runtime.jar
    servlet-api.jar
      

  13.   

    服务端一般不会用这么底层的来编写吧,开发服务端webService的工具很多,XFire,Axis,Hessian都很好用,直接用SOAP来传送不太方便
      

  14.   

    没有用过,开发服务端webService的工具很多,XFire,Axis,Hessian都很好用,直接用SOAP来传送不太方便
      

  15.   

    直接发底层报文给webservice是没问题的,突然发现这个帖子太老,就不详细介绍了