1

我有 XML 和 JSON 格式的 REST 服务:

http://localhost:5050/rest/rest/report/check/ {id}/{checksum}.xml http://localhost:5050/rest/rest/report/check/ {id}/{checksum}.json

示例:调用http://localhost:5050/rest/rest/report/check/420/339d9146ddd3d6646a1fe93ddf4d7ab8c4a51c61.xml将返回结果:

<report>
  <id>420</id>
  <checksum>339d9146ddd3d6646a1fe93ddf4d7ab8c4a51c61</checksum>
  <checksumValid>true</checksumValid>
  <reportName>sprawozdanie 1</reportName>
  <userName>John Smith</userName>
  <state>robocze</state>
</report>

现在我想从 JQuery 调用那个 REST 服务(xml 或 json,我不在乎)。

我要做的是:

$.ajax({
    type:"GET",
    url:"http://127.0.0.1:5050/rest/rest/report/check/" + obj.id + "/" + obj.checksum + ".xml",
    success:function (data, textStatus) {
        alert('success...');
    },
    error:function (xhr, ajaxOptions, thrownError) {
        alert("thrown: '" + thrownError + "', status: '" 
        + xhr.status + "', status text: '"
         + xhr.statusText + "'");
    }
});

最后我调用了错误函数,结果是:

抛出:'',状态:'0',状态文本:'错误'

我究竟做错了什么?

4

3 回答 3

2

您需要使用localhost而不是127.0.0.1由于同源策略。

于 2012-04-26T19:49:44.833 回答
0

同意同源政策。这是测试是否是这种情况的快速方法:

  1. 通过命令行启动 chrome,使用“--user-data-dir=C:\deleteAfterwards --disable-web-security”
  2. 尝试相同的查询

如果它有效,那么您的问题是同源政策。这个策略对于在开发环境中工作来说是一种痛苦,因为您必须将 Web 服务托管在与托管 JavaScript 的站点相同的主机上(不允许使用别名)和端口。

您可以使用代理通过同一服务器托管服务和网站。这篇文章是 Apache (WAMP) 的一个很好的参考,如果你碰巧使用的是:

于 2012-04-26T19:58:04.797 回答
0

好的,所以这个问题是微不足道的,显然我前段时间曾经使用过它并忘记了它(该死的我需要一个 wiki :) )。

无论如何,问题都是所谓的“跨域”,这在我的 spring-mvc 休息项目中被 deafult 禁止。

我所做的是创建一个新的过滤器

public class OptionsHeadersFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
        response.setHeader("Access-Control-Max-Age", "360");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }
}

并将其添加到我的 web.xml

<filter>
    <filter-name>OptionsHeadersFilter</filter-name>
    <filter-class>poi.rest.OptionsHeadersFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>OptionsHeadersFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
于 2012-04-26T19:55:04.047 回答