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

わかりました、問題は些細なことで、どうやら私は少し前にそれをハックしていたようで、それを忘れていました(くそー、wikiが必要です:))。

いずれにせよ、問題はいわゆる「クロスドメイン」であり、私の spring-mvc rest プロジェクトではデフォルトで禁止されていました。

私がしたことは、新しいフィルターを作成することでした

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 に答える
0

同一原産地政策に同意。これが事実であるかどうかをテストする簡単な方法は次のとおりです。

  1. 「--user-data-dir=C:\deleteAfterwards --disable-web-security」を使用して、コマンド ラインから Chrome を起動します。
  2. 同じクエリを試す

それが機能する場合、問題は同じオリジン ポリシーです。JavaScript をホストしているサイトと同じホスト (エイリアスは許可されていません) とポートで Web サービスをホストする必要があるため、このポリシーは開発環境での作業には苦痛です。

プロキシを使用して、サービスとウェブサイトの両方を同じサーバー経由でホストできます。Apache (WAMP) を使用している場合、この記事は Apache (WAMP) の優れたリファレンスです。

于 2012-04-26T19:58:04.797 に答える