0

jQueryを使用してクロスドメイン呼び出しを行おうとしていますが、これまでのところかなり失敗しています。私のHTMLファイルは私の「C:/Temp」フォルダ名「test.html」にあります。私のHTMLコードは以下のとおりです-

<!DOCTYPE html> 
<html> 
    <head> 
    <title>My Page</title> 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
</head> 
<body> 
<input id="first_name" type="text" value="khan" />
<input id="clickme" type="button" value="Click Me!"/>

<script type="text/javascript">
    $(document).ready(function() {
        $("#clickme").click(function(){
            $.ajax({
                url: 'http://localhost:8008/qm/profile/' + $("#first_name").val() + "/",
                type: "GET",
                dataType: "jsonp",
                crossDomain : true,
                success: function(response)
                    {
                        alert(response.responseText);
                    },
                error: function()
                    {
                        alert("fail");
                    },
            });
        });
    });

</script>

</body>
</html>

サーバー側には、次のような小さなPythonコードがあります-

def profile(request, username):
    fullname = ''
    if username == 'khan':
        fullname = 'Khan Hannan'
    data = {'fullname': fullname}
    print data
    return HttpResponse(json.dumps(data))

PythonコードはDJangoプロジェクト内にあります。URL('http:// localhost:8008 / qm / profile / khan')を直接呼び出すと、サーバーからJSON応答が返されますが、jQueryを介して同じURLを入力すると、'応答があり、失敗します。

なにか提案を?

4

2 に答える 2

0

JSONP は、JSON を関数でラップし、関数を実行してコード オブジェクトを取得することで機能します。

これは、JSON オブジェクトをラップするサーバーにコールバック クエリ文字列値を送信することによって行われます。

サーバーに送信されるリクエストを調べると、 という値が一緒に送信されていることがわかりますcallback=jquery[long number]

http://en.wikipedia.org/wiki/JSONP

于 2012-09-13T19:44:03.303 に答える
0

JSONP コールバック コンストラクトを作成する必要があります。JSON 戻り値は、callbackリクエスト パラメータで指定されたコールバック関数に渡されます。

Django スニペットのサイトには、JSONP 用の便利なデコレーターがあり、これを処理して、ユーザーが認証されていることも確認します。

そのデコレーターを使用したくない場合は、少なくともcallback応答で request パラメーターを使用し、正しいコンテンツ タイプを設定します。

return HttpResponse("%s(%s)" % (request.GET['callback'], json.dumps(data)),
    content_type='application/javascript'))
于 2012-09-13T19:53:45.653 に答える