2014-04-07 106 views
2

我相信這個問題以前已經問過,但是給出的答案並不足以指出我的代碼出錯的地方。我很抱歉,如果這是一個類似的問題存在;我花了幾個小時搜索並找不到解決方案。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的工作。

+3

爲了使用'JSONP',您的API需要能夠處理它:使用JSONP,API必須以'JSON'數據作爲參數返回一個方法調用。調用的方法名稱通常可以使用像'jsonp'這樣的參數來指定(實現由您決定)。一個例子是SO API:http://api.stackoverflow.com/1.1/tags/ravendb/wikis?jsonp=useData('useData'是這裏的回調方法名稱) – Lukas

+0

[Make ajax ajax JSONP請求與jQuery](http://stackoverflow.com/questions/11736431/make-cross-domain-ajax-jsonp-request-with-jquery) – Paul

+1

注:JSONP和CORS是分開的方法。要理解JSONP爲什麼會失敗並返回一個缺失的回調函數,請參閱上面的鏈接。但是發佈的代碼有另一個問題,因爲服務器端是爲CORS設置的,客戶端使用的是JSONP。選擇一個並在雙方執行。我會認爲在服務器上設置CORS,將客戶端更改爲使用CORS將是最簡單的。 – Paul

回答

0

我會去換一個CORS,這會使瀏覽器之間的大部分差異正常化。我與xdomain取得了最佳體驗。它在客戶端是不可知的,你可以在不改變任何東西的情況下使用jQuery XHR或任何其他庫。