2012-01-05 161 views
1

有一個域名,我不控制它返回JSON數據 - 要http://services.example.com/search?store=ITUNES&q=twitter產生類似403禁止對JSONP請求

{ 
    MySearch: { 
    resultCount: 1 
    results: [ 
     { name: "twitter" } 
    ] 
    } 
} 

當我嘗試從另一個域中的JSONP得到它,如從(使用jQuery)我自己的電腦 -

$.ajax({ 
    url: 'http://services.example.com/search?store=ITUNES&q=twitter', 
    dataType: 'jsonp', 
    success: function(data) { 
     console.log('hi'); 
    } 
}); 

我得到 「狀態代碼:403禁止」。

這裏是服務器的響應頭:

Connection:keep-alive 
Content-Length:9 
Content-Type:text/plain 
Date:Thu, 05 Jan 2012 20:33:04 GMT 
Server:WEBrick/1.3.1 (Ruby/1.9.3/2011-10-30) 
X-Frame-Options:sameorigin 

有沒有什麼方法可以讓我得到這個數據未做任何服務器端更改?

+0

您需要參數中的回調函數名稱。你能發佈確切的網址嗎? – Joseph 2012-01-05 23:31:55

+1

JSONP設置需要來自服務器端的合作。似乎服務器不使用JSONP – Joseph 2012-01-06 01:54:13

回答

-3

這是由於瀏覽器的cross origin resource sharing policy

要啓用此功能,您必須添加特殊標題以「預檢」您的請求。否則,JSONP tactic將允許您跨域訪問數據,但它必須實際上是JSONP而不僅僅是JSON。

這裏有一個關於如何啓用跨域資源共享PHP中的例子:

<?php 
     header('Access-Control-Allow-Origin: http://sub.domain.com'); 
     header('Access-Control-Allow-Credentials: true'); 
?> 

正如你說的,不幸的是,我認爲這是在你的控制。事實上,安全機制的部分原因是爲了防止類似情況發生(即通過使用JSON來破壞其他服務器資源)。

+1

http://api.jquery.com/jQuery.getJSON/ - 腳本和JSONP請求不受同一個源策略限制。 – Joseph 2012-01-05 23:27:36

+0

請重新閱讀他想要做的事情。數據看起來不是JSONP或腳本,因此使用這些方法將不起作用。 – buley 2012-01-05 23:29:46

+1

*有沒有什麼辦法可以在不進行任何服務器端更改的情況下獲取這些數據?* - 他這樣說。另外,JSONP不會綁定到相同的原始策略。直到他用真正的網址編輯網址,我們不會確定哪裏出錯。這是他放置的「example.com」。 – Joseph 2012-01-05 23:44:20

-2

請嘗試下面的代碼片段。請記住,整個響應將被存儲爲在控制檯的對象並且可以簡單地引用與數據[I]各鍵值對等

var jServices = jQuery.noConflict(); 
jServices.ajaxSetup({ 
    contentType: "application/jsonp; charset=UTF-8" 
}); 
jServices.getJSON("http://services.joppio.com/services/search?session=AF8990-34GDC-03345&store=ITUNES&pos=0&cnt=10&q=twitter", function (data) { 
    console.log(data); 
}); 

希望它解決了您的問題。