1

Geobytesからデータを取得しようとしています。テンプレートの1つがJSONを返し、クロスドメインアクセスする必要があります。

私はこれらの2つの関数を書きました

function getCountry(ip) {
    var surl = "http://www.geobytes.com/IpLocator.htm?GetLocation&template=json.txt";
    $.ajax({
        url: surl,
        data: '{"ipaddress":"' + ip + '"}',
        dataType: "jsonp",
        processData: false,
        jsonpCallback: "jsonpcallback",
        error: function (xhr, status, error) {
            alert(xhr.responseText);
        }
    });
}

function jsonpcallback(rtndata) {
    alert(rtndata.message);
}

呼び出しは正常に実行されます。これらは私の応答ヘッダーです。

HTTP/1.1 200 OK
Date: Sat, 17 Nov 2012 12:43:54 GMT
Expires: 0
Content-type: text/html
Transfer-Encoding: chunked

返されるデータはJSONですが、

警告:リソースはスクリプトとして解釈されますが、MIMEタイプtext / htmlで転送されます: "http://www.geobytes.com/IpLocator.htm?GetLocation&template=json.txt&callback=jsonpcallback&{%22ipaddress%22:%22200.167.254.166%22} &_ = 1353148931121"

リモートIpLocator.htmのエラー:キャッチされていないSyntaxError:予期しないトークン:

エラーはで返されたデータにスローされます

{"geobytes":{"countryid":117,

「117」ではなく117であるためかと思いますが、返されるデータを制御できないことは明らかです。「processData=false」を追加しようとしましたが、役に立ちませんでした。

エラー処理をajaxに追加し、ステータスで「parsererror」を取得しました

どうすればこれを修正できますか?

4

2 に答える 2

2

次のようにフィールドdataTypeを変更してみてください。

..。
dataType: "jsonp json"、
..。

このようにして、取得したデータはjsonとして解析されます。

ドキュメントに従う:

サーバーから返されると予想されるデータのタイプ。何も指定されていない場合、jQueryは応答のMIMEタイプに基づいて推測しようとします。

あなたの場合、取得するMIMEはtext / htmlであり、dataTypeに「json」値を追加して、応答をテキストではなくjsonとして扱うようにjQueryに指示します。

サービスがJSONPをサポートしていない場合は、リクエストを処理するための独自のプロキシページを作成するか、ここで説明するようにYQLを使用できます。サーバーがJSONPをサポートしていない場合のクロスドメインリクエスト

于 2012-11-17T11:21:35.300 に答える
0

私を正しい方向に向けてくれたno.andreaに感謝します!

MVC3を使用しているので、新しいコントローラーを追加しました

[HttpPost]
public JsonResult JsonGetCountry(string ip)
{
    try
    {
        var sb = new StringBuilder();
        sb.Append("http://www.geobytes.com/IpLocator.htm?GetLocation");
        sb.Append("&template=json.txt");
        sb.Append("&IpAddress=");
        sb.Append(ip);

        var webClient = new WebClient();
        var data = webClient.OpenRead(sb.ToString());

        if (data == null) { return Json(""); }

        var reader = new StreamReader(data);
        var msg = reader.ReadToEnd();
        data.Close();
        reader.Close();

        return Json(msg);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message, ex);
    }
}

JQuery関数をに更新しました

function getCountry(ip) {
    $.ajax({
        type: "POST",
        url: "/My-Shop/IP/JsonGetCountry",
        data: '{"ip":"' + ip + '"}',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            var a = $.parseJSON(msg);
            alert(a.geobytes.iso2);
        },
        error: function (ex) {
            alert(ex.statusText);
    }
});

そしてそれは私のすべての問題を修正しました:)

于 2012-11-17T15:16:57.513 に答える