简体   繁体   English

如何从JQuery调用Soap Web服务

[英]How to call a soap web service from JQuery

I have developed a sample application for calling soap web service from JQuery, but I am facing some problem to finding service. 我已经开发了一个示例应用程序,用于从JQuery调用Soap Web服务,但是我在查找服务时遇到了一些问题。 I am using apache cxf 2.2.6 jars. 我正在使用apache cxf 2.2.6 jar。

I used this 我用这个
http://www.local-guru.net/blog/2010/1/24/calling-webservices-from-mootools-jquery-or-dojo to create a webservice cal from JQuery http://www.local-guru.net/blog/2010/1/24/calling-webservices-from-mootools-jquery-or-dojo从JQuery创建Web服务校准

this is my interface 这是我的界面

package guru.service;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.xml.ws.RequestWrapper;
@WebService( targetNamespace = "http://www.local-guru.net/helloService" )
public interface HelloService {
    @RequestWrapper( targetNamespace="http://www.local-guru.net/helloService" )
    public String hello(@WebParam( name="givenname", targetNamespace="http://www.local-guru.net/helloService"  ) String givenname, @WebParam( name="name", targetNamespace="http://www.local-guru.net/helloService" ) String name );
}

My implementation class is 我的实现类是

package guru.service;
import javax.jws.WebService;
@WebService( endpointInterface="guru.service.HelloService", serviceName="HelloService", targetNamespace = "http://www.local-guru.net/helloService" )
public class HelloServiceImpl implements HelloService{
    public String hello( String givenname, String name ) {
        return "Hello " + givenname + " " + name + "!";
    }
}

And My application context 和我的应用程序上下文

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">   
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />           
    <bean id="helloServiceImpl" class="guru.service.HelloServiceImpl" />    
        <jaxws:endpoint id="helloService" 
        implementor="#helloServiceImpl" address="/helloService"/>        
</beans>

I can see my WSDl definition by using this URL 我可以使用此URL查看我的WSDl定义

http://192.168.1.209:8080/sampleWebService/helloService?wsdl http://192.168.1.209:8080/sampleWebService/helloService?wsdl

Using soapUI 3.6.1 software I created soap request for this service 使用soapUI 3.6.1软件,我为此服务创建了soap请求

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hel="http://www.local-guru.net/helloService">
   <soapenv:Header/>
   <soapenv:Body>
      <hel:hello>         
         <hel:givenname>MAYA</hel:givenname>         
         <hel:name>MANI</hel:name>
      </hel:hello>
   </soapenv:Body>
</soapenv:Envelope>

My Service response is 我的服务回应是

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:helloResponse xmlns:ns2="http://www.local-guru.net/helloService">
         <return>Hello MAYA MANI!</return>
      </ns2:helloResponse>
   </soap:Body>
</soap:Envelope>

but when I try to call my service using jquery, I get this error 但是当我尝试使用jquery调用服务时,出现此错误

WARNING: Interceptor for {http://www.local-guru.net/helloService}HelloService has thrown exception, unwinding now org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader. 警告:{http://www.local-guru.net/helloService}HelloService的拦截器已引发异常,现已展开org.apache.cxf.binding.soap.SoapFault:读取XMLStreamReader时出错。 at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:230) at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:109) at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:406) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:178) at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doOptions(AbstractHTTPServlet.java:132) at javax.servlet.http.H 在org.apache的org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)的org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:230) org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:109)上的.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)在org.apache.cxf.transport.servlet.ServletDestination.invoke(Servlet org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:406)(org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:178)处的.java:98)。 org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)处的apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)org.apache.cxf.transport.servlet处的AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)。 javax.servlet.http.H上的AbstractHTTPServlet.doOptions(AbstractHTTPServlet.java:132) ttpServlet.service(HttpServlet.java:718) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Pr org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)上的ttpServlet.service(HttpServlet.java:718)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)在org.apache.catalina.core.StandardFilterrin在org.apache.catalina.core.StandardFilterValin.dov(ApplicationFilterChain.java:213) (StandardContextValve.java:178),位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126),位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105),位于org.apache。 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)上的catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 856),网址为org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.processConnection(Http11Pr otocol.java:744) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:619) Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog at [row,col {unknown-source}]: [1,0] at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:686) at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2134) at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2040) at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069) at com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1095) at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:122) ... 25 more 在org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)处的otocol.java:744)在org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)处.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:684)at java.lang.Thread.run(Thread.java:619)原因:com.ctc.wstx.exc.WstxEOFException:意外在[row,col {unknown-source}]中序言中的EOF:com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:686)处的com.ctc.wstx.sr.BasicStreamReader中的[1,0]。在com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2040)处com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)处handleEOF(BasicStreamReader.java:2134) .wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1095)位于org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:122)... 25更多

And my html page is 我的html页面是

<html>
<head>
    <script src="jquery.js"></script>
    <script>
function callservice() {
    var givenname = $("#givenName").val();
    var name = $("#name").val();

    var q ='<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hel="http://www.local-guru.net/helloService"><soapenv:Header/><soapenv:Body><hel:hello><hel:givenname>'+givenname+'</hel:givenname><hel:name>'+name+'</hel:name></hel:hello></soapenv:Body></soapenv:Envelope>'
           $.ajax({
        url: 'http://192.168.1.209:8080/sampleWebService/helloService/hello',
        data: q,
        type: 'post',
        contentType: 'text/xml; charset="utf-8"',
        success: function(res) {
            $('#result').html(
                res.getElementsByTagNameNS("http://www.local-guru.net/helloService",
                "helloResponse")[0].childNodes[0].childNodes[0].nodeValue);
        },

    });
}
    </script>
</head>
<body>
    <form>
        <input type="text" id="givenName"/>
        <input type="text" id="name"/>
        <input type="button" onClick="callservice()"/>
    </form>
    <div id="result">result</div>
</body>
</html>

Please help me solve this problem. 请帮我解决这个问题。

from the error you posted it looks to me like the XML payload in your Ajax request is malformed or not what the server expects, have you inspected the request and response in your browser? 从您发布的错误来看,我觉得您的Ajax请求中的XML有效负载格式不正确或不是服务器期望的,您是否在浏览器中检查了请求和响应? In situations like this (which often crop up IME) seeing what the difference between your expected SOAP request and what is actually being sent is invaluable. 在这种情况下(通常会使IME泛滥),看到预期的SOAP请求与实际发送的SOAP之间的区别是非常宝贵的。

I would suggest that if the above is true, most likely you have an issue with line endings, or encoding of the "q" string of xml. 我建议,如果上述情况属实,则很可能是行尾或xml的“ q”字符串编码存在问题。 To test, try something like this: http://www.w3schools.com/dom/dom_loadxmldoc.asp 要测试,请尝试以下类似操作: http : //www.w3schools.com/dom/dom_loadxmldoc.asp

Which parses a "well formed" xml file from disk, then sends it :-) 它从磁盘解析“格式正确”的xml文件,然后将其发送:-)

Browser blocks access across domain-boundaries. 浏览器阻止跨域边界的访问。 Try deploying your HTML page in the webservice domain. 尝试在Web服务域中部署HTML页面。

For more info: http://enable-cors.org/ 有关更多信息: http : //enable-cors.org/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM