IGS_学习笔记07_IREP通过页面测试客户化Web Service调用(案例)

20150819 Created By BaoXinjian

一、摘要


在编写客户化的PL/SQL程序,并将其发布到Oracle Integration Repositroy中,进而发布为Web服务,

本文描述通过第三方的程序来调用过我们的Web服务,来验证客户化的Web服务是否能够被正常调用,

在Oracle Integrate SOA Gataway的开发手册中介绍了如何在BPEL流程中调用客户化的Web服务,

而搭建一个BPEL的运行环境对于开发人员来说需要耗费比较多的时间,而且需要对BPEL的开发比较熟悉,否则无法顺利的进行;

另外很多时候开发Web服务的目的也并不仅仅是为了给BPEL流程调用,因此大动干戈去设计一个BPEL流程来测试我们客户化的Web服务显然不现实,

本文就介绍如何采用简单的方法来进行Web服务的测试。

1. 使用Oracle EBS服务器中OC4J自带的Web服务测试页面进行测试

2. 采用第三方软件,如soapUI来进行测试

 

二、 准备测试Web服务


Step1. 当发布完Web服务之后,就有http://paleonode1.sh.paleotek.com:8002/webservices/SOAProvider/plsql/oraclebxj_emp_pkg/这样的Web服务WSDL地址生成

Step2. 这个地址是中间应用服务器中Web服务描述的地址,只要去掉这个地址中最后?WSDL之后在浏览器中打开就可以看到如下的界面

这个测试页面会根据Web服务的方法参数不同Body部分会发生变化,其它地方的结构都是一样的,在界面中根据方法的参数情况填入参数值,

需要注意的是需要勾上 WS-Security 后面的 Include In Header,然后输入登录Oracle EBS应用的用户的密码,

这个用户必须要通过发布客户化集成接口为Web Service, 并Create Grant权限给该Oracle Erp应用的用户

 

三、解决Message send failed: For input string: “”问题


1. 上面的信息输入完成后,点击 Invoke 按钮来进行测试,报出如下的错误:

javax.xml.soap.SOAPException: java.security.PrivilegedActionException: javax.xml.soap.SOAPException: Message send failed: For input string: “”

2. 这个错误是由于OC4J的JVM中启用了代理服务的配置,只要将其去掉就可以:

将$ORA_CONFIG_HOME/10.1.3/j2ee/oafm/config/oc4j.properties 文件中

http.proxyHost

http.proxyPort

这两行注释掉,然后重启服务就可以了。

3.  再次填写信息提交后会报出 wsse:FailedAuthentication 这样的错误信息:

这是由于提交的Soap消息中并没有包括Oracle Integration Repository要求的AOL安全认证,

即没有Oracle EBS系统要求的用户、职责、安全组和语言信息,也就是没有进行Oracle EBS的环境初始化,

而这个Web服务的测试页面并不是专门给IREP的服务使用的,所以并不带AOL权限认证的标记信息,所以要手工修改XML文件,添加上述信息

 

四,修改测试请求XML数据


通过修改提交的SOAP的XML信息,让XML信息中包括这些认证信息,点击上图中选项按钮切换到XML模式。

可是我应该修改成什么样的XML信息才能将认证信息包括进去呢,这个就需要使用第三方工具SoapUI在分析WSDL的时候帮助自动生成。

1. 将原来的XML修改为如下的内容:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:wsu
="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:orac
="http://xmlns.oracle.com/apps/sqlap/SOAProvider/plsql/oraclebxj_emp_pkg/"> <soap:Header> <wsrm:Request xmlns:wsrm="http://www.oasis-open.org/committees/wsrm/schema/1.1/SOAP1.1"
xmlns:SOAP
="http://schemas/xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="1"> <wsrm:MessageId groupId="20150820-015045-985.1@paleonode1.sh.paleotek.com"/> <wsrm:ExpiryTime>2015-08-20T01:50:55</wsrm:ExpiryTime> <wsrm:ReplyPattern> <wsrm:Value>Poll</wsrm:Value> </wsrm:ReplyPattern> <wsrm:AckRequested/> <wsrm:DuplicateElimination/> </wsrm:Request> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns
="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env
="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns
="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:Username>sysadmin</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">sysadmin</wsse:Password> </wsse:UsernameToken> </wsse:Security> <orac:SOAHeader> <!--Optional:--> <orac:Responsibility>APPLICATION_DEVELOPER</orac:Responsibility> <!--Optional:--> <orac:RespApplication>FND</orac:RespApplication> <!--Optional:--> <orac:SecurityGroup>STANDARD</orac:SecurityGroup> <!--Optional:--> <orac:NLSLanguage>AMERICAN</orac:NLSLanguage> <!--Optional:--> <orac:Org_Id>204</orac:Org_Id> </orac:SOAHeader> </soap:Header> <soap:Body xmlns:ns1="http://xmlns.oracle.com/apps/bxj/soaprovider/plsql/oraclebxj_emp_pkg/create_employee/"> <ns1:InputParameters> <ns1:P_EMPNO>1</ns1:P_EMPNO> <ns1:P_ENAME>2</ns1:P_ENAME> <ns1:P_JOB>3</ns1:P_JOB> <ns1:P_MGR>4</ns1:P_MGR> <ns1:P_HIREDATE/> <ns1:P_SAL>5</ns1:P_SAL> <ns1:P_COMM>6</ns1:P_COMM> <ns1:P_DEPTNO>7</ns1:P_DEPTNO> </ns1:InputParameters> </soap:Body> </soap:Envelope>

2. 其中黑体标出的部分就是需要自己添加,关键的几个标签:

(1). xmlns:orac

安全认证的命名空间,如果你对XSD不熟悉,那xmlns:orac的值如何来确定呢?

最简单的就是看soap:Body xmlns:ns1 后面的值,只要这个值到PLSQL包名的级别,

如我的例子就是http://xmlns.oracle.com/apps/sqlap/SOAProvider/plsql/oraclebxj_emp_pkg/

(2). SOAHeader

其中的子标签的结构永远都是这样的,只是里面的值需要根据情况进行改变,这个标签下的内容和我们使用 fnd_global 包来初始化应用环境的道理是一样的

(3). Responsibility

代表上面提供的用户名下用哪个职责来调用Web服务,我想对于Oracle EBS二次开发人员对这个应该会比较有感觉,有可能不同的职责的设置或预置文件都不一样,对应的是职责的key

(4). RespApplication

是职责所对应的应用简称,如FND

(5). SecurityGroup

职责对应的安全组,一般情况下都是STANDARD

(6). NLSLanguage

需要的语言环境,如AMERICAN

(7). Org_Id

职责对应的默认OU值,如204

 

五、使用SOA Monitor来监控诊断问题


 1. 上面调用了Web服务但是返回了错误信息,这时候就需要借助SOA Monitor工具来查看详细的错误信息,进而分析问题的所在,进入页面并查找出Web服务调用的历史记录

2. 然后点击Response列中的眼睛图标进入查看Web服务调用的回应消息,打开后可以看到整个错误的堆栈信息,这里摘取主要的一段:

 Error Description  User not authorized to execute service. 
Error Details  oracle.apps.fnd.soa.util.SOAException: AuthorizationFailure: Error in authorization check. Responsibility Name and Responsibility Application Name are either invalid or not assigned to the user
    at oracle.apps.fnd.soa.provider.services.jca.JCAHandler.handleRequest(JCAHandler.java:110)
    at oracle.apps.fnd.soa.provider.SOAProvider.processMessage(SOAProvider.java:272)
    at oracle.j2ee.ws.server.provider.ProviderProcessor.doEndpointProcessing(ProviderProcessor.java:956)
    at oracle.j2ee.ws.server.WebServiceProcessor$1.run(WebServiceProcessor.java:358)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at oracle.j2ee.ws.server.WebServiceProcessor.invokeEndpointImplementation(WebServiceProcessor.java:355)
    at oracle.j2ee.ws.server.provider.ProviderProcessor.doRequestProcessing(ProviderProcessor.java:466)
    at oracle.j2ee.ws.server.WebServiceProcessor.processRequest(WebServiceProcessor.java:114)
    at oracle.j2ee.ws.server.WebServiceProcessor.doService(WebServiceProcessor.java:96)
    at oracle.j2ee.ws.server.WebServiceServlet.doPost(WebServiceServlet.java:194)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
    at java.lang.Thread.run(Thread.java:619)
oracle.apps.fnd.soa.util.SOAException: InvalidHeader: Responsibility Name and Responsibility Application Name are either invalid or not assigned to the user
    at oracle.apps.fnd.soa.provider.services.AuthorizationHandler.authorize(AuthorizationHandler.java:104)
    at oracle.apps.fnd.soa.provider.services.jca.JCAHandler.handleRequest(JCAHandler.java:98)
    at oracle.apps.fnd.soa.provider.SOAProvider.processMessage(SOAProvider.java:272)
    at oracle.j2ee.ws.server.provider.ProviderProcessor.doEndpointProcessing(ProviderProcessor.java:956)
    at oracle.j2ee.ws.server.WebServiceProcessor$1.run(WebServiceProcessor.java:358)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at oracle.j2ee.ws.server.WebServiceProcessor.invokeEndpointImplementation(WebServiceProcessor.java:355)
    at oracle.j2ee.ws.server.provider.ProviderProcessor.doRequestProcessing(ProviderProcessor.java:466)
    at oracle.j2ee.ws.server.WebServiceProcessor.processRequest(WebServiceProcessor.java:114)
    at oracle.j2ee.ws.server.WebServiceProcessor.doService(WebServiceProcessor.java:96)
    at oracle.j2ee.ws.server.WebServiceServlet.doPost(WebServiceServlet.java:194)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(Serve
 

 

六、 准备测试Web服务


1. 查看XML数据源, 修改正确的配置信息后,再次提交请求

2. 再次测试后得到如下的结果:这是由于我调用的是一个过程没有返回值,

test_custom_plsql_dept_ws_result

3. 到数据中查询确认一下是否有数据进去

select count(*) from bxj_soa_employees

4. 也可以通过SOA Monitor来查看Web服务运行的情况

soa_monitor_success

 

Thanks and Regards

参考:张礼军先生 - http://oracleseeker.com/2009/10/22/test_invoke_web_service_in_irep/

posted on 2014-09-07 22:00  东方瀚海  阅读(669)  评论(0编辑  收藏  举报