2013-02-13 141 views
1

我想創建一個簡單的Jquery移動應用程序。 我的設立情況如下:9090/MYAPP:jquery跨域ajax請求總是錯誤

  1. jQuery的客戶端上本地主機上運行。
  2. 我的服務器上本地主機上運行:9010 /報童
  3. 因爲我是在Windows上,在服務器端我用一個簡單的服務器使用「」,這是一個Python的微框架建立。
  4. 服務器根據請求返回json,我可以在Chrome或Firefox中清楚地看到它。
  5. 我已驗證我的回覆,並且它是有效的JSON。

我面對的問題是,我希望我的客戶端從服務器響應中讀取json。
但是因爲它是一個跨域問題,所以無法這樣做。
下面是客戶端我的Ajax代碼:

$.ajax({ 
     url: "http://localhost:9010/paperboy/toi", 
     type:"GET", 
     data:$(this), 
     dataType:"jsonp", 
     //jsonp:"callback", no support on the server 

     success:function(result){ 
      console.log("ajax result: " + result); 
     }, 

     error:function(e){ 
      console.log("Error :" + e); 
     } 
    }); 

和我的瓶子服務器的代碼是:

from bottle import route, run, template, response 
from paperboy import getToiNews 

''' call http://localhost:9010/paperboy/toi in browser''' 

@route('/paperboy/:source') 
def index(source='All'): 
    print "requesting news list for %s" % source 
    resultJson = getToiNews() 
    response.content_type = "application/javascript" 
    return resultJson 

run(host='localhost', port=9010) 

不過上運行我最初是越來越「阿賈克斯出身的政策錯誤」的應用程序,它很快一旦我將內容類型添加到我的服務器,就離開了。
現在ajax調用沒有錯誤,但始終調用「錯誤」處理程序。我嘗試了各種組合,但都徒勞無功。我無法弄清楚的一件事是將jsonp支持添加到我的服務器。
我很感謝在這個問題上的任何幫助,並提前感謝您的所有幫助。
謝謝。

+0

我也嘗試從服務器設置內容類型爲「application/json」。 – 2013-02-13 08:40:40

回答

4

你自己說過,因爲它是一個跨源呼叫,默認情況下它不被SOP所禁用。

如果您在控制服務器(和您),則可以使用CORS來允許請求。這將適用於任何現代瀏覽器。 (儘管在IE8和IE9的情況下,你需要一個jQuery補丁來啓用特定於微軟的XDomainRequest對象,而不是標準的XMLHttpRequest; jQuery團隊拒絕將它放入庫中,域處理爲XMLHttpRequest。)

或者,由於響應是JSON,因此您可以使用非常類似的JSON-P,它可以與所有瀏覽器(並且不使用jQuery修補程序)配合使用。

+0

輝煌!非常感謝你。它像一個魅力。我所要做的就是設置一個標題屬性。事實上,它存在於使用hooks插件的瓶子文檔中(http://bottlepy.org/docs/dev/recipes.html)。我看起來很糟糕。 – 2013-02-13 08:55:11

+0

@ ashish.gd:很高興幫助! – 2013-02-13 09:03:58