22

http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=jsonから JSON を取得しようとすると:

(jQuery 1.6.2)

$.ajax({
    type: "GET",
    url: url,
    dataType: "jsonp",
    success: function (result) {
        alert("SUCCESS!!!");
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.statusText);
        alert(xhr.responseText);
        alert(xhr.status);
        alert(thrownError);
    }
});

私は得る:parsererror; 200; undefined; jquery162******************** was not called

しかし、 http: //search.twitter.com/search.json?q=beethoven&callback=?&count= 5 の JSON では問題なく動作します。どちらも有効な JSON 形式です。それで、このエラーは何ですか?

[アップデート]

@ 3ngima、これをasp.netに実装しましたが、正常に動作します:

$.ajax({
    type: "POST",
    url: "WebService.asmx/GetTestData",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result) {
        alert(result.d);
    }
});

WebService.asmx:

[WebMethod]
public string GetTestData()
{
    try
    {
        var req = System.Net.HttpWebRequest.Create("http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json");
        using (var resp = req.GetResponse())
        using (var stream = resp.GetResponseStream())
        using (var reader = new System.IO.StreamReader(stream))
        return reader.ReadToEnd();
    }
    catch (Exception) { return null; }
}
4

3 に答える 3

35

これは、JSONではなくJSON -Pを期待していることをjQueryに伝えているためです。しかし、戻り値はJSONです。JSON-Pの名前はひどく間違っており、混乱を招くことのない方法で名前が付けられています。これは、タグを介して関数にデータを伝達するための規則です。対照的に、JSONはデータ形式です。script

JSONの例:

{"foo": "bar"}

JSON-Pの例:

yourCallback({"foo": "bar"});

JSONはJavaScriptリテラル表記のサブセットであるため、JSON-Pは機能します。callbackJSON-Pは、呼び出している関数名にコールバックする関数名を指定すると(通常はリクエストにパラメーターを入力することにより)、応答がの形式になるという約束にすぎません。functionname(data)ここで、data「JSON "(または、より一般的には、JavaScriptリテラル。これはまったく同じではない場合があります)。scriptタグでJSON-PURLを使用してsrc(jQueryが自動的に実行します)、同じオリジンポリシーを回避して、ajaxリクエストが元のドキュメント以外のオリジンからのデータを要求しないようにします(サーバーがサポートしている場合を除く)CORSとブラウザも同様です)。

于 2011-07-10T21:34:36.037 に答える
0

サーバーがリクエストをサポートしていない場合は、次のcross domainことができます。

  1. サーバー側プロキシを作成する
  2. jsonサービスから取得するプロキシに ajax リクエストを実行し、
  3. 応答を返すと、それを操作できます...

phpでは、このようにすることができます

proxy.php には次のコードが含まれています

<?php

if(isset($_POST['geturl']) and !empty($_POST['geturl'])) {
$data = file_get_contents($_POST['geturl']);
print $data;
}

?>

そして、このようにプロキシに ajax リクエストを行います

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
alert("abt to do ajax");

$.ajax({
url:'proxy.php',
type:"POST",
data:{geturl:'http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json'},
success:function(data){
alert("success");
alert(data);
}    
});    
});   
});
</script>

試行錯誤した結果、json応答が返されました...

于 2011-07-10T21:56:44.973 に答える
0

ついに私は解決策を見つけました。まず第一に、Web サービスまたはページの Web メソッドは機能しません。常に xml を返します。ローカルでは正常に機能しますが、godaddy のようなサービス プロバイダーでは機能しません。

私の解決策は.ahsx、.net でハンドラーを作成し、jsonp を渡す jquery コールバック関数でコンテンツをラップすることでした。

[System.Web.Script.Services.ScriptService]
public class HandlerExterno : IHttpHandler
{
    string respuesta = string.Empty;

    public void ProcessRequest ( HttpContext context )
    {


       string  calls=  context.Request.QueryString["callback"].ToString();

         respuesta = ObtenerRespuesta();
        context.Response.ContentType = "application/json; charset=utf-8";
        context.Response.Write( calls +"("+    respuesta +")");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    [System.Web.Services.WebMethod]
    private string ObtenerRespuesta ()
    {



        System.Web.Script.Serialization.JavaScriptSerializer j = new System.Web.Script.Serialization.JavaScriptSerializer();


        Employee[] e = new Employee[2];
        e[0] = new Employee();
        e[0].Name = "Ajay Singh";
        e[0].Company = "Birlasoft Ltd.";
        e[0].Address = "LosAngeles California";
        e[0].Phone = "1204675";
        e[0].Country = "US";
        e[1] = new Employee();
        e[1].Name = "Ajay Singh";
        e[1].Company = "Birlasoft Ltd.";
        e[1].Address = "D-195 Sector Noida";
        e[1].Phone = "1204675";
        e[1].Country = "India";

        respuesta = j.Serialize(e).ToString();
        return respuesta;

    }

}//class

public class Employee
{
    public string Name
    {
        get;
        set;
    }
    public string Company
    {
        get;
        set;
    }
    public string Address
    {
        get;
        set;
    }
    public string Phone
    {
        get;
        set;
    }
    public string Country
    {
        get;
        set;
    }
}

jquery を使用した呼び出しは次のとおりです。

$(document).ready(function () {
    $.ajax({
        // url: "http://www.wookmark.com/api/json",
        url: 'http://www.gjgsoftware.com/handlerexterno.ashx',
        dataType: "jsonp",


        success: function (data) {
            alert(data[0].Name);
        },
        error: function (data, status, errorThrown) {
            $('p').html(status + ">>  " + errorThrown);
        }
    });
});

そして完璧に動作します

ガブリエル

于 2013-02-02T15:58:57.590 に答える