最近在做一个系统,我们只做服务端,客户来调用我们的服务,系统需求是这样的:
通过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包,有用过这个包的,并有实践经验的大虾们帮忙,看如何编写服务端程序,包括报文解释,报文返回。非常感谢。分数不够我还可以加,直到问题解决完为止,大家一块来帮忙吧,小弟第一次搞这个网上看了很多资料,都不是我想要的,最好有一位在线帮忙的老师哈,我是北京的,如果帮忙解决问题,俺请你吃饭~~~~
通过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包,有用过这个包的,并有实践经验的大虾们帮忙,看如何编写服务端程序,包括报文解释,报文返回。非常感谢。分数不够我还可以加,直到问题解决完为止,大家一块来帮忙吧,小弟第一次搞这个网上看了很多资料,都不是我想要的,最好有一位在线帮忙的老师哈,我是北京的,如果帮忙解决问题,俺请你吃饭~~~~
<?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>
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;
}
}
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();
}
}}
另外,我想要的是SOAP解释器的代码,有谁有吗?就是如何通过服务器端的servlet接收到SOAP协议传送过来的报文,根据报文进行解释,并将处理结果再次打包成SOAP协议的形式,response给客户端。有谁用过SOAP 2.3.1这个版本的东西???
咱没技术,先用工具!
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");
soapUI 加tcptrace soap开发调测之利器。哈哈
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>
jaxm-api.jar
jaxm-runtime.jar
servlet-api.jar