1

こんにちは私は奇妙な問題に直面しています。別のドメインの Web サービスを使用する必要があります。それで、クロムアドオンSimple REST Clientのコードを調べたところ、この機能を使用してXHRを作成していることがわかりました

function sendRequest() {
clearFields();
if ($("#url").val() != "") {
    var a = new XMLHttpRequest;
    a.onreadystatechange = readResponse;
    try {
        a.open($("input[type=radio]:checked").val(), $("#url").val(), true);
        //This code is for adding headers
        var b = $("#headers").val();
        b = b.split("\n");
        for (var c = 0; c < b.length; c++) {
            var d = b[c].split(": ");
            d[1] && a.setRequestHeader(d[0], d[1])
        }
        jQuery.inArray($("input[type=radio]:checked").val(), ["post", "put"]) > -1 ? a.send($("#postputdata").val()) : a.send("")
    } catch (e) {
        console.log(e);

        $("#responsePrint").css("display", "")
    }
} else {
    console.log("no uri");

}
}

だから私は似たようなものを作成しました

    var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var test = $(xmlhttp.responseText);
    }
}
xmlhttp.open("GET", "http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", true);
//xmlhttp.setRequestHeader('Access-Control-Allow-Origin','*');
 xmlhttp.send();

しかし、私のコードXMLHttpRequest cannot load http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy. Origin http://localhost:51582 is not allowed by Access-Control-Allow-Origin. では、どこに問題があるのでしょうか? なぜ以前のコードは機能するのに、ほとんど同じではないのですか?

編集:私はまた、この関数でウェブサービスを呼び出そうとしました

$.ajax({
    type: "GET",
    url: "http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy",
    contentType: "script; charset=utf-8",
    dataType: "jsonp",
    success: function (msg) {
        var tes = $(msg);
    },
    error: function (xhr, status, err) {
    }
});

WebサービスはHTMLページ全体を返し、必要なdivは1つだけなので、私がやりたいことは応答をDOMとして読み取ることですが、今ではUncaught SyntaxError: Unexpected token <この行へのポイントを取得しています

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

[ネットワーク] タブでわかるように、リクエストは機能しますが、エラーのために成功関数が呼び出されず、データにアクセスできません。

4

3 に答える 3

1

他の人が指摘しているように、これはSame Origin Policyによるものです。これはブラウザによって強制されるものであり、アドオンがこの制限を回避できることを意味します。これで最初の質問に答えるはずです。

これを回避する方法は?多くの方法がありますが、ほとんどの場合、サーバーからの何らかの協力が必要です。人々はすでにこれらの回避策のいくつかをここで言及しており、JSONP パスを試してエラーが発生したようです。

エラーが発生した理由を教えてください。スクリプトは、JSONP 形式で応答を受け取ることを期待していましたが、そうではなかったため、代わりに HTML 応答を受け取りました。サーバーは間違いなくこのように設計されていないため、このアプローチはあなたの場合には機能しないと思います。

本当の問題は、なぜこれをやりたいのかということです。あなたの答えに応じて、いくつかの解決策を考えることができます。

たとえば、そのページの情報にアクセスして Web サイトに表示する必要がある場合、最も簡単な解決策はプロキシを使用することだと思います ( http://developer.yahoo.com/javascript/howto-proxy を参照)。詳細については、 htmlを参照してください)。

個人的な目的で自分のマシンでこれを使用している場合は、一部のブラウザーで同一オリジン ポリシー チェックを無効にすることができます。

たとえば、Chrome では、次のオプションを指定して実行するとうまくいきます: (警告: サポートされていません! セキュリティは確実に低下します)

chrome --disable-web-security

これを行う場合 (ブラウザのセキュリティ チェックを無効にする)、単純な場合でも:

$.get("http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", function(data) {
    console.log(data);
},'html');

うまくいきます。

于 2013-04-12T22:32:44.043 に答える