2012-09-13 106 views
0

我想使用jQuery進行跨域調用,但迄今爲止相當不成功。我的HTML文件位於'C:/ Temp'文件夾名'test.html'。我的HTML代碼如下 -jQuery跨域調用

<!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時,沒有得到任何迴應,它失敗了。

有什麼建議嗎?

+0

它看起來並不像你回來JSONP。另外,我建議你不要從文件系統工作,它有一個不同於普通網絡服務器的安全規則。 –

回答

0

JSONP的工作原理是將JSON封裝在一個函數中,然後執行函數來獲取代碼對象。

這是通過向服務器發送一個回調查詢字符串值來完成的,然後假設它包裝了JSON對象。

如果您檢查發送到服務器的請求,則應該看到一個值爲callback=jquery[long number]的值。

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

+0

謝謝特拉維斯。我錯過了從我的服務器到客戶端的JSON數據包裝。這工作! – Khan

0

你需要創建一個JSONP回調結構,其中JSON返回值傳遞給在callback請求paramater命名的回調函數。

Django Snippets站點有一個handy decorator for JSONP爲您負責,並驗證用戶是否已通過身份驗證。

如果你不想使用裝飾,起碼使用callback請求參數在您的回覆,並設置正確的內容類型:

return HttpResponse("%s(%s)" % (request.GET['callback'], json.dumps(data)), 
    content_type='application/javascript'))