2013-05-13 65 views
2

我在PHP中做了一個簡單的API。 此API回顯是使用json_encode的對象。API停止支持JSONP

每例如:

echo json_encode($obj); 

我使用jQuery檢索這個API的信息。 測試腳本和API時,它們都在同一臺服務器上運行。 一切正常。

了jQuery的例子:

$.ajax({ 

    url: "php/api/test.php" 
    dataType: "json", 
    type: "POST", 
    succes: function(data) { 
     console.log("success"); 
    }, 
    error: function(response) { 
     console.log("error"); 
    } 
}); 

現在這個工作得很好。 但是由於API在外部服務器上運行,這不再起作用了(是的,我將url更改爲正確的)。

我不得不改變API和JavaScript以便使用JSONP 在jQuery最終會從API接收信息之前。

我的jQuery的是現在:

$.ajax({ 

    url: "http://externalserver/php/api/test.php" 
    dataType: "jsonp", 
    type: "POST", 
    succes: function(data) { 
     console.log("success"); 
    }, 
    error: function(response) { 
     console.log("error"); 
    } 
}); 

的PHP會爲了工作返回此:

echo $_REQUEST['callback'] . '(' . json_encode($obj) . ')'; 

現在我其實寧願JSONP代替使用JSON。

我知道我需要修改PHP文件,讓API接受來自像我這樣的外部腳本的輸入請求。

你能告訴我我需要做什麼嗎?

+0

您可以使用阿賈克斯爲此 – Shin 2013-05-13 09:08:59

+0

我不明白你的問題,請指明你在找什麼,你需要什麼。 – Reflic 2013-05-13 09:09:10

+2

@shin:你認爲OP在做什麼? JSON,jQ PHP,外部服務器......它都指向AJAX,不是嗎?對於OP:你是否問如何讓X域XhttpRequests工作? – 2013-05-13 09:12:17

回答

3

您需要在標題中設置一個參數,允許CrossOriginRessourceSharing (CORS)或者由於同源策略(SOP),您的瀏覽器將阻止這些呼叫。如果你在你的php中設置了allow-origin-response-header,那麼一切都應該按照預期工作。

header('Access-Control-Allow-Origin: *'); 

test.php的頂部將解決您的問題。 (或者最好將*替換爲您的呼叫來自的特定域)。

4

AFAIK,您正在運行AJAX請求的跨域問題。針對此問題的最簡單,最多的跨瀏覽器修補程序是使用JSONP。在您的PHP腳本中沒有什麼可以解決這個問題的權威性,因爲它部分取決於客戶端。 Not a lot of people know how to disable the cross-domain ban either,出於測試目的,您可以考慮禁用瀏覽器安全。

只要使用JSONP,說實話,它會爲您節省很多頭痛。如果您已經在使用jQuery,那麼您可以使用其最佳功能(跨域事物)。
如果您曾經計劃拋棄jQuery,請致電read up on what CORS requests entail

+0

爲什麼選擇DV?我不介意,只要我知道爲什麼... – 2013-05-13 09:19:28

+0

1)禁用瀏覽器安全=錯誤,2)JSONP = OP不想使用它,它也是非常受限制的,例如,沒有POST請求可能(如果你正在使用web服務,通​​常需要這樣做)3)「沒有什麼可以做你的PHP腳本來解決這個問題」=錯誤 - 你只需要設置一些頭來修復這個問題 – Christoph 2013-05-13 09:22:03

+0

@克里斯托夫:1)你可以這樣做,我從來沒有推薦過它。 2)OP不想使用它,而我說這將是最簡單的解決方案。如果OP正在測試某些東西,那麼稍後將在同一臺服務器上運行,JSONP是最容易使用的東西。 3)足夠公平,儘管這意味着能夠發出初始請求。有時,這不可能 – 2013-05-13 09:26:36