- 浏览: 145864 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
murphee:
请问下如果要给header设置固定值呢?比如 <so ...
根据WSDL生成带SOAPHeader节点的报文 -
double_f:
这里有更详细解答,来自官方:jse为用于桌面应用软件,及服务器 ...
认识J2EE规范或标准以及J2EE和JEE有什么不同? -
除了你无可取代:
灰常不错的
关于ExtJS插件Spket安装指南 (转) -
hf_jj:
lz 你好 下载你的包发现点了没有生成代码 能否发一份可以的给 ...
Axis2_1.X学习笔记 -
faith515:
兄台 ,你咋个自动添加请求头的啊,我现在遇到一个问题没法解决呢 ...
根据WSDL生成带SOAPHeader节点的报文
最近项目组经常的做SOAP接口,给第三方调用;由于经常改动以及为了让新员工快速开发,自己用bat命令做了一个快速生成客户端与服务端的工具,共享给大家。
(本文所提到的Axis2_141文件夹与axis2文件夹,请参考附件目录)
Axis2根据业务类来发布自己的wsdl服务详解
1. 新建自己的web工程,该web应用项目通过下面系列配置,达到向外提供Webservice服务的目的:
(1) 在Axis2_141文件夹下新建名为services.xml的文件,内容:
<service name="SampleServer" scope="application" targetNamespace="http://zzvcom.SampleServer/"> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> </messageReceivers> <schema schemaNamespace="http://zzvcom.SampleServer/xsd (这一行是确定命名空间的,可以不加它会自动生成(加上就是自己定义命名"/> 空间) <parameter name="ServiceClass"> zzvcom.ws.SampleServerImpl(这里是你的业务类路径,发布的业务名称)这里根据具体情况要修改 </parameter> </service>
这里面也可以配置多个服务:要用到<serviceGroup>这里面可以放置多个(<service></<service>)</serviceGroup>
(2) 双击releaseMySelfWsdl.bat文件我将会把services.xml打包为aar文件放在Axis2_141\axis2\WEB-INF\services目录下。
注意:(打开releaseMySelfWsdl.bat文件,找到下面这行:set serviceName="myService"修改为set serviceName="你自己想生成的aar名称")
(3) 访问axis2的内部文件夹:把axis2-web(为了直观的看到服务界面,真正发布时可删除)和WEB-INF下面的conf、lib、modules、services(为了直观的看到多个服务,真正发布时可删除里面不需要的服务)拷贝到工程中对应的目录下(axis2-web拷贝到工程的WebRoot目录下)。
(4) 修改web.xml(和根据wsdl发布服务里的修改web.xml一样)略。
(5) 在tomcat下发布工程,就可以访问你的服务了。
用axis2根据WSDL快速生成soap服务详解
(此次发布包含了axis2自带的ws)
1. 把你的wsdl文件改名为wsdl.wsdl放在Axis2_141目录下。
2. 双击createServer.bat即可生成服务端代码并放在server目录下。
3. 双击package_arr.bat在server文件中生成了*.arr,这就是你要发布的服务。
4. 新建web工程,把axis2文件中的WEB-INF目录下的conf、lib、modules、serices拷贝到工程对应的WEB-INF下面。
最好也把axis2-web拷贝到工程WebRoot目录下面。
5. 把生成的服务端代码拷贝到工程对应的src目录下,再把*.aar文件拷贝到WEB-INF\services下面。
6. 把一下配置拷贝到web.xml中:
<!--axi2相关配置-->
<display-name>Apache-Axis2</display-name>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis2.transport.http.AxisServlet
</servlet-class>
<!--<init-param>-->
<!--<param-name>axis2.xml.path</param-name>-->
<!--<param-value>/WEB-INF/conf/axis2.xml</param-value>-->
<!--<param-name>axis2.xml.url</param-name>-->
<!--<param-value>http://localhost/myrepo/axis2.xml</param-value>-->
<!--<param-name>axis2.repository.path</param-name>-->
<!--<param-value>/WEB-INF</param-value>-->
<!--<param-name>axis2.repository.url</param-name>-->
<!--<param-value>http://localhost/myrepo</param-value>-->
<!--</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisAdminServlet</servlet-name>
<servlet-class>
org.apache.axis2.webapp.AxisAdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisAdminServlet</servlet-name>
<url-pattern>/axis2-admin/*</url-pattern>
</servlet-mapping>
7. 目前你就已经发布成功你的ws了。
8. 我们找到*ServiceSkeleton结尾的类,在哪里你可以调用具体的业务实现。
根据wsdl生成客户端代码
1. 双击createClient.bat文件,在client目录下可以找到你生成的客户端代码。
2. 你可以新建java工程把client目录里的代码拷贝到src目录下(一般只有两个类)
3. 新建一个客户端调用类:
public class Client
{
/**
* @param args
* @author MKF14241
*/
public static void main(String[] args)
{
try
{
//就是刚刚生成的stub类(把你发布的服务地址作为够照参数传进去)
ImsServiceStubStub stub =
new ImsServiceStub("http://10.168.8.169:8066/BmeIMSAxis2Server/services/ImsService");
ImsServiceStub.DeletePrivateNumberingPlan request =
new ImsServiceStub.DeletePrivateNumberingPlan();\\new 内部类(一些bean对象或者是请求响应对象)
request.setPrivateNamberingPIanName("mlml");
request.setPrivateNumberingPlanKey(11111l);
ImsServiceStub.DeletePrivateNumberingPlanResponse response =
stub.deletePrivateNumberingPlan(request);
System.err.println("returnCode is key:" + response.getResultcode());
System.err.println("returnDesc is pnpname:" + response.getResultdesc());
}
catch (AxisFault e)
{
e.printStackTrace();
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
}
注意:
1. 执行package_aar.bat时,打开package_aar.bat文件,找到下面这行:
set serviceName="bmeService" 修改为 set serviceName="你自己的发布服务名称"。
2 . 附件里面的axis2及axis2-1.1里面的内容已清空,分别是开源的axis2.war与axis2-1.1.zip,请从apache网站下载解压覆盖,才可以用。
关于Axis2的SOAP头鉴权处理详解
在项目中做SOAP接口时,为了安全考虑一般都会对调用方作鉴权,这时需要添加鉴权头报文,你有两种方案:
A、你可以在SOAP消息头中添加,这样在服务端可以通过定义handler来对消息头进行统一处理鉴权。----这样处理起来比较统一,但是业务逻辑里得不到头消息体里的内容。
B、你可以在Body消息体里添加,这个就像普通参数一样,在每个方法的入参参数里加个头消息体,服务端需要在每个方法里取出头消息参数,进行鉴权。------这样比较灵活,可以在业务逻辑里运用头消息里明的参数。
下面介绍A方案的实现
1. 首先需要改写wsdl如下片段:
Type元素中头类型定义:
<xsd:element name="MessageHeader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="msgName" type="xsd:string"
maxOccurs="1" minOccurs="1"></xsd:element>
<xsd:element name="transactionID" type="xsd:string"
maxOccurs="1" minOccurs="1">
</xsd:element>
<xsd:element name="version" type="xsd:string"
maxOccurs="1" minOccurs="1"></xsd:element>
<xsd:element name="timeStamp" type="xsd:string"
maxOccurs="1" minOccurs="1"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
头消息:
<wsdl:message name="MessageHeader">
<wsdl:part element="tns:MessageHeader" name="parameters" ></wsdl:part>
</wsdl:message>
在对应的方法的operation中加入消息头:(一般在入参input中加入)
<wsdl:operation name="IndividualSubscribe">
<soap:operation
soapAction="http://www.example.org/FemtoManagerWS/IndividualSubscribe" />
<wsdl:input>
<soap:body use="literal" />
<soap:header use="literal" part="parameters" message="tns:MessageHeader">
</soap:header>
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
2. 这时候你可以用改过的wsdl,按照上面步骤部署服务端,然后开始写头消息处理handler,并在axis2.xml里配置:
(1)handler处理类:
package com.ml.www.ngin.mo.auth;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler;
/**
*
*/
public class LoginAuthHandler extends AbstractHandler implements Handler
{
@SuppressWarnings("unchecked")
public InvocationResponse invoke(MessageContext msgContext)
throws AxisFault
{
// 存储头信息
Map<String, String> map = new HashMap<String, String>();
// 获得soapHeader的对象元素
OMElement header = msgContext.getEnvelope().getHeader()
.getFirstElement();
for (Iterator<OMElement> i = header.getChildElements(); i.hasNext();)
{
OMElement el = i.next();
map.put(el.getLocalName().trim(), el.getText().trim());
}
// 效验SoapHeader信息
if (null == map.get("userName") || !map.get("userName").equals("2012"))
{
throw new SoapException("you input username not right", "121212");
}
if (null == map.get("passWord") || !map.get("passWord").equals("2012"))
{
throw new SoapException("you input password not right", "121212");
}
return InvocationResponse.CONTINUE;
}
public void revoke(MessageContext msgContext)
{
//测试时打印报文
System.out.println(msgContext.getEnvelope().toString());
}
(2)异常处理类:
package com.ml.www.ngin.mo.auth;
import org.apache.axis2.AxisFault;
import org.codehaus.xfire.fault.XFireFault;
/**
* SoapException
*/
public class SoapException extends AxisFault
{
public SoapException(String messageText, String faultCode)
{
super(messageText, faultCode);
// TODO Auto-generated constructor stub
}
/**
* filed description
*/
private static final long serialVersionUID = 1L;
}
(3)在axis2.xml里配置LoginAuthHandler:
<!-- ================================================= --> <!-- Phases --> <!-- ================================================= --> <phaseOrder type="InFlow"> <!-- 配置自定义的handler --> <phase name="loginAuth"> <handler name="auth" class="com.ml.www.ngin.mo.auth.LoginAuthHandler"> </handler> </phase> <!-- System predefined phases --> <phase name="Transport"> <handler name="RequestURIBasedDispatcher" class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"> <order phase="Transport"/> </handler> <handler name="SOAPActionBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"> <order phase="Transport"/> </handler> </phase> <phase name="Addressing"> <handler name="AddressingBasedDispatcher" class="org.apache.axis2.dispatchers.AddressingBasedDispatcher"> <order phase="Addressing"/> </handler> </phase> <phase name="Security"/> <phase name="PreDispatch"/> <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase"> <handler name="RequestURIBasedDispatcher" class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/> <handler name="SOAPActionBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/> <handler name="RequestURIOperationDispatcher" class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/> <handler name="SOAPMessageBodyBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/> <handler name="HTTPLocationBasedDispatcher" class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/> <handler name="GenericProviderDispatcher" class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/> <handler name="MustUnderstandValidationDispatcher" class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/> </phase> <phase name="RMPhase"/> <!-- System predefined phases --> <!-- After Postdispatch phase module author or service author can add any phase he want --> <phase name="OperationInPhase"> <handler name="MustUnderstandChecker" class="org.apache.axis2.jaxws.dispatchers.MustUnderstandChecker"> <order phase="OperationInPhase"/> </handler> </phase> <phase name="soapmonitorPhase"/> </phaseOrder>
- Axis2_141.zip (2.7 KB)
- 下载次数: 111
评论
发表评论
-
用CXF开发SOAP接口
2012-02-01 13:26 3737请参照:apache-cxf-2.5.1、jdk1.6.0_1 ... -
根据一定规则的excel生成wsdl文件(工具源码)
2011-10-21 10:41 2559前一段时间,公司项目 ... -
关于MyEclipse安装Axis2插件
2011-10-19 15:25 932关于插件安装 引用链接: (1) http://ww ... -
关于SOAP请求报文里的元素与wsdl中元素属性的关系
2011-09-29 23:27 5135关于SOAP请求参数顺序以及对象下面参数不全与wsdl中元素属 ... -
根据WSDL生成带SOAPHeader节点的报文
2011-09-29 23:18 13077在soap头鉴权中,往往我们要手动的添加SO ... -
Axis1.x版本的学习笔记
2011-09-28 00:09 3882用axis1.4发布自己的wsdl服务详解 ... -
WebService学习片段
2011-09-27 23:17 962SOA(Service-Oriented Architectu ... -
学习webService各种场景应用资料
2009-12-21 08:09 1130学习webService各种场景应用资料
相关推荐
X = data.drop('species', axis=1) # 特征 y = data['species'] le = LabelEncoder() y = le.fit_transform(y) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # ...
除了设置坐标轴的范围,我们还可以通过`plt.axis("equal")`确保x轴和y轴具有相同的度量单位,使得在绘制例如圆形的图形时能够保持正确的形状。 ### 总结 这份笔记整理详细介绍了量化分析中Tushare库和Matplotlib库...
在给定的"matlab学习笔记.pdf"中,我们探讨了如何使用MATLAB进行图形绘制以及一些关键的图形命令和属性。 首先,从描述中可以看到,MATLAB被用于绘制多个正弦波形的图形。通过`x=-2*pi:0.1:2*pi;`定义了x轴的取值...
【MATLAB学习笔记】 MATLAB是一款强大的数学计算和数据分析软件,广泛应用于科研和工程领域。以下是一些关于MATLAB的基本知识点: 1. **函数eval**: `eval`函数在MATLAB中用于执行字符串中的MATLAB代码。它可以...
Java学习笔记涵盖了许多重要的编程概念和技术,特别是在JavaMail、Oracle数据库管理和索引、自定义对象序列化以及数据库导入导出方面。以下是对这些主题的详细解释: 1. **JavaMail**: JavaMail是一个用于处理...
8. **图形控制**:`plot`函数用于绘制二维图形,`axis`函数调整坐标轴范围,`axis equal`使X和Y轴单位长度相同,`axis square`使图像为正方形,`axis tight`适应性调整范围,`axis ij`和`axis xy`改变坐标轴方向,`...
【Matlab学习笔记】 Matlab是一款强大的数学计算和数据分析软件,尤其在工程计算、科学建模和算法开发中广泛使用。以下是一些Matlab的基本概念和常用操作: 1. **文件命名与界面恢复**:Matlab是区分大小写的,...
在MATLAB的学习中,了解和掌握各种函数及操作是至关重要的。...以上就是MATLAB学习笔记中涉及的一些关键知识点,涵盖了函数使用、数据操作、图形绘制等多个方面,对于理解和使用MATLAB进行数据分析和计算很有帮助。
### Pandas学习笔记 #### 一、简单操作 ##### 1. Series 对象 - **创建**:可以通过列表、NumPy 数组或字典来创建一个 `Series` 对象。 - 使用列表创建: ```python s = pd.Series([12, -4, 7, 9]) ``` - ...
pandas 和 numpy 笔记 在数据科学和机器学习中,pandas 和 numpy 是两种非常重要的库,它们提供了强大的数据处理和分析功能。下面是对 pandas 和 numpy 的一些重要知识点的总结。 数据导入 pandas 提供了多种方式...
在MATLAB的学习中,了解和掌握各种函数及操作是非常关键的。以下是一些关于MATLAB的重要知识点: 1. **函数eval**:`eval`函数在MATLAB中用于执行字符串中的MATLAB代码,它允许我们将字符串作为表达式来计算,从而...
你可以定义一个简短的匿名函数,如`f = @(x) 2*x`,这样`f`就成为了一个函数句柄,之后可以通过`f(1)`来调用这个函数,输出结果为2。 在Matlab中,基础绘图是十分重要的部分。可以使用`plot`函数来绘制二维曲线,有...