从jquery调用Web服务的麻烦

时间:2013-04-15 19:25:08

标签: java jquery web-services axis2 cors

我已经创建了一个带有axis2的web服务,并且我已经使用eclipse部署在apache tomcat 7中。

这是我在Web服务中转换的类。这只是一个回声:

package test.org;
public class TestWS {
    public String echo(String s){
        return ("You typed: " + s);
    }
}

如果我从Eclipse尝试这个Web服务,在Web Services Explorer中添加wsdl它可以很好地工作,但是当我尝试从jquery中使用这个ws时会出现问题。 我可以毫无问题地访问wsdl,它位于:http://localhost:8080/SimpleWS/services/TestWS?wsdl

但是,当我尝试此代码时,会发生以下错误:XMLHttpRequest无法加载http://localhost:8080/SimpleWS/services/TestWS。 Access-Control-Allow-Origin不允许使用null。

我一直在阅读关于CORS以及在服务器端包含这样的代码:Access-Control-Allow-Origin:*,但是因为我直接用eclipse部署了我的ws我不知道如何这样做,我不确定这是不是我的问题。

提前谢谢!!

这是我的代码:

<h3>Web service example</h3>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">

function callWS() {
    var soapmessage = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' " +
                                    "xmlns:q0='http://org.test' xmlns:xsd='http://www.w3.org/2001/XMLSchema'" +
                                    "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
                      soapmessage += "<soapenv:Body>";
                      soapmessage += "<q0:echo>";
                      soapmessage += "<q0:s>HELLO</q0:s>";
                      soapmessage += "</q0:echo>";
                      soapmessage += "</soapenv:Body>";
                      soapmessage += "</soapenv:Envelope>";
                      alert(soapmessage);
                      $.ajax({
                          type: 'POST',
                          url: 'http://localhost:8080/SimpleWS/services/TestWS',
                          data: soapmessage,
                          contentType: "application/xml; charset=utf-8",
                          dataType: "xml",
                          success: function (data) {
                             alert(data);
                          },
                          error: function (data) {
                              alert("error" + data.d);
                          }
                     });
                     alert("Form Submitted");
}

</script>

<form method="post" action="">
    <input type="button" onclick="callWS()" value="execute" />
</form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

我建议采用更简单的方法来做同样的事情。

该功能可能是:

function callWS() {
    $.ajax({
        url: "http://localhost:8080/SimpleWS/services/TestWS/echo", 
        type: "POST",
        data: { s : "HELLO" }, 
        success: function(data, textStatus, jqXHR) {
            alert($(data).find("return").text());
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(jqXHR.status + " " + jqXHR.statusText);
        }
    });
}

在URL中添加要调用的操作名称。数据是一个带有每个参数的键值对的映射。

操作名称和键名必须与WSDL文档匹配,包括响应中每个元素的名称。您可以使用以下命令查看架构文件:

http://localhost:8080/SimpleWS/services/TestWS?xsd

这就是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" ... >
  <xs:element name="echo">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="s" nillable="true" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="echoResponse">
    <xs:complexType>
      <xs:sequence>
       <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

此文件列出了两种主要类型(对于此示例),带有s元素的请求和带有return元素的响应。

WSDL显示操作的名称。

<wsdl:binding name="TestWSHttpBinding" type="ns:TestWSPortType">
  <http:binding verb="POST"/>
  <wsdl:operation name="echo">
    <http:operation location="echo"/>
    <wsdl:input>
      <mime:content type="application/xml" part="parameters"/>
    </wsdl:input>
    <wsdl:output>
      <mime:content type="application/xml" part="parameters"/>
    </wsdl:output>
  </wsdl:operation>
</wsdl:binding>

另见:

{h1> null 不允许关于原点Access-Control-Allow-Origin

很可能是您使用本地文件使用XMLHttpRequest发出请求。例如从:

file:///C:/Users/Paul/Desktop/index.html

域,协议和端口与WebService的URL不同。维基百科在Same origin policy中说明了这一点:

  

术语“origin”是使用域名,应用程序层协议和(在大多数浏览器中)运行脚本的HTML文档的端口号定义的。当且仅当所有这些值完全相同时,才认为两个资源具有相同的来源。

尝试使用相同来源中的文件,例如:

http://localhost:8080/SimpleWS/index.jsp