我相信這個問題以前已經問過,但是給出的答案並不足以指出我的代碼出錯的地方。我很抱歉,如果這是一個類似的問題存在;我花了幾個小時搜索並找不到解決方案。jQuery PHP跨域請求問題
我在PHP中構建了一個小型RESTful-esque服務,用於將數據庫信息引入我的站點。我可以成功地從瀏覽器和Fiddler撥打電話,但是當我嘗試請求$.ajax()
的數據時,我會彈出。第一件事,第一,讓我張貼的PHP代碼:
我打電話http://api.horodyski.me
class ApiController
{
protected $endpoint = '';
protected $method = '';
protected $verb = '';
protected $args = Array();
public function __construct($request)
{
header("Access-Control-Allow-Orgin: *");
header("Access-Control-Allow-Methods: GET");
header("Content-Type: application/json");
$this->args = explode('/', rtrim($request, '/'));
$this->endpoint = array_shift($this->args);
if (array_key_exists(0, $this->args) && !is_numeric($this->args[0])) { $this->verb = array_shift($this->args); }
$this->method = $_SERVER['REQUEST_METHOD'];
if($this->method != 'GET')
throw new Exception("Unexpected Header");
$this->request = $this->_cleanInputs($_GET);
}
public function processAPI()
{
$class = $this->endpoint."Controller";
if(class_exists($class))
{
$controller = new $class();
return $this->_response($controller->getAllItems());
}
return $this->_response("No Endpoint: ".$this->endpoint, 404);
}
private function _response($data, $status = 200)
{
header("HTTP/1.1 ".$status." ".$this->_requestStatus($status));
// $data comes back from controller in JSON format.
return json_encode($data);
}
private function _cleanInputs($data)
{
$cleanInput = Array();
if(is_array($data))
foreach($data as $k => $v)
$cleanInput[$k] = $this->_cleanInputs($v);
else
$cleanInput = trim(strip_tags($data));
return $cleanInput;
}
private function _requestStatus($code)
{
$status = array(
200 => 'OK',
404 => 'Not Found',
405 => 'Method Not Allowed',
500 => 'Internal Server Error',
);
return ($status[$code]) ? $status[$code] : $status[500];
}
}
我試圖實現我的jQuery調用返回jsonp
,這是我卡住。
要求從http://horodyski.me/v2
。下面的代碼顯示正常json
返回類型:
<p class="test"></p>
<script>
$(document).ready(function() {
$.ajax({
url: "http://api.horodyski.me/skills",
method: "GET",
dataType: 'jsonp',
success: function (data) {
$("p.test").text(data);
},
error: function (xhr, textStatus, error) {
debugger;
}
});
});
</script>
我得到了我的錯誤回調如下:
textStatus = "parseerror"
error = "jQuery210008879405278902885_1396911952892 was not called"
再次,提琴手不顯示錯誤 - 我的想法。我不是在PHP端正確處理它,還是我的jQuery搞砸了?也許我需要編輯我的.htaccess
文件來處理在jsonp調用中從jQuery發送的回調參數?我在這裏有什麼建議嗎?
我可以打電話http://horodyski.me/api/skills
,它可以使用普通的json,但我仍然無法獲得CORS的工作。
爲了使用'JSONP',您的API需要能夠處理它:使用JSONP,API必須以'JSON'數據作爲參數返回一個方法調用。調用的方法名稱通常可以使用像'jsonp'這樣的參數來指定(實現由您決定)。一個例子是SO API:http://api.stackoverflow.com/1.1/tags/ravendb/wikis?jsonp=useData('useData'是這裏的回調方法名稱) – Lukas
[Make ajax ajax JSONP請求與jQuery](http://stackoverflow.com/questions/11736431/make-cross-domain-ajax-jsonp-request-with-jquery) – Paul
注:JSONP和CORS是分開的方法。要理解JSONP爲什麼會失敗並返回一個缺失的回調函數,請參閱上面的鏈接。但是發佈的代碼有另一個問題,因爲服務器端是爲CORS設置的,客戶端使用的是JSONP。選擇一個並在雙方執行。我會認爲在服務器上設置CORS,將客戶端更改爲使用CORS將是最簡單的。 – Paul