2011-11-14 24 views
6

Tôi đang sử dụng Restler để triển khai API REST đơn giản. Bây giờ nếu tôi cần phải tiêu thụ API đó thông qua AJAX từ một tên miền khác, tôi sẽ cần phải gửi một tham số gọi lại cùng với các yêu cầu của tôi. Có hỗ trợ cho điều này trong Restler (tôi vẫn chưa tìm thấy bất kỳ tài liệu thực tế)?Tham số gọi lại Luracast Restler cho tên miền chéo AJAX

Trả lời

5

Đối với bất kỳ ai đến trang này từ googling, tôi đã gửi một vấn đề tại github và nhận được sự hỗ trợ tuyệt vời từ tác giả. Hóa ra nó khá tầm thường để thực hiện, nếu bạn đã quen thuộc với cách Restler được xây dựng.

Từ https://github.com/Luracast/Restler/issues/17

<?php 
//jsonpformat.php 
class JsonpFormat implements iFormat { 

    const MIME = 'text/javascript'; 
    const EXTENSION = 'js'; 
    /* 
    * JsonFormat is used internally 
    * @var JsonFormat; 
    */ 
    public $jsonFormat; 
    public static $functionName = 'parseResponse'; 

    public function __construct() { 
     $this->jsonFormat = new JsonFormat(); 
     if (isset ($_GET ['jsonp'])) { 
      self::$functionName = $_GET ['jsonp']; 
     } 
    } 
    public function getMIMEMap() { 
     return array (self::EXTENSION => self::MIME); 
    } 
    public function getMIME() { 
     return self::MIME; 
    } 
    public function getExtension() { 
     return self::EXTENSION; 
    } 
    public function encode($data, $human_readable = FALSE) { 
     return self::$functionName . '(' . $this->jsonFormat->encode ($data, $human_readable) . ');'; 
    } 
    public function decode($data) { 
     return $this->jsonFormat->decode ($data); 
    } 
    public function setMIME($mime) { 
     //do nothing 
    } 
    public function setExtension($extension) { 
     //do nothing 
    } 
} 
?> 

này nên được lưu trong cùng thư mục với file restler.php. Một khi bạn đã có, chỉnh sửa gateway của bạn (index.php) để bao gồm tập tin này và thêm nó như là một định dạng được hỗ trợ. Ví dụ:

<?php 
require_once '../../restler/restler.php'; 

#set autoloader 
#do not use spl_autoload_register with out parameter 
#it will disable the autoloading of formats 
spl_autoload_register('spl_autoload'); 

$r = new Restler(); 
$r->setSupportedFormats('JsonpFormat','JsonFormat', 'XmlFormat'); 
$r->addAPIClass('BMI'); 
$r->handle(); 
?> 
+0

Tốt. Tôi tự hỏi, nếu đây là an toàn bảo mật: self :: $ _ GET ['jsonp']? –

+0

Hacking khuôn khổ là allways một ý tưởng tồi ... Điều này là tốt hơn ... – danielrvt

+0

Không nên Luracast cho phép chúng tôi để thiết lập một giao thức loại thành viên 'Defaults :: $ accessControlAllowHeaders' tĩnh? – Miles

1

Điều này làm việc tốt cho chúng tôi: tiêu đề ('Access-Control-Allow-Origin: *');

Thêm điều này vào phương thức bộ điều khiển trước khi trả về một điểm cuối, cho bộ tạo lớp bộ điều khiển cho tất cả các điểm cuối trong nhánh đó hoặc cao hơn để cho phép trang đó rộng.

Nếu bạn chỉ cho phép một số trang web truy cập tiêu đề sử dụng ('Access-Control-Allow-Origin: example.com') hoặc một cái gì đó như tiêu đề ('Access-Control-Allow-Origin:'. $ Remote_domain). Trong trường hợp $ remote_domain được đặt động dựa trên một số được truyền theo mã thông báo hoặc như vậy. Kiểm tra Chia sẻ nguồn gốc chéo (CORS) để biết lý do giới hạn việc sử dụng * ký tự đại diện.

<?php 

class Say { 

__construct(){ 
    header('Access-Control-Allow-Origin: *'); //Here for all /say 
} 

function hello($to='world') { 
    header('Access-Control-Allow-Origin: *'); //Here for just /say/hello 
    return "Hello $to!"; 
    } 
} 

Các tác phẩm trên cho GET và POST, các hành động khác yêu cầu một số thông tin bổ sung về tiêu đề từ người khôi phục. Dưới đây là một số ví dụ:

tiêu đề ('Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS'); tiêu đề ('Access-Control-Allow-Headers: whatever_headers_you_allow, header1, header2');

Đối với IE9 trở xuống, bạn sẽ cần một bản hack JSONP. Trình khôi phục có ví dụ về việc mở rộng lớp iFormat để bọc kiểu đầu ra API JASONP.

Khám phá các hack của Mozilla để biết chi tiết về CORS. http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ Và kiểm tra OPTIONS in PHP REST API

+0

Các công trình trên tuyệt vời cho GET và POST nhưng các hành động khác yêu cầu một số công trình xung quanh. Kiểm tra hack của Mozilla để biết thêm chi tiết. http: //hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors / – punkael

0

Tôi sẽ thêm ở đây rằng nếu vì một lý do bạn không muốn sử dụng JSONP, bạn chỉ có thể thêm:

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

mỗi câu trả lời đầu tiên của punkael (ông đã không xác định nơi để làm điều này trong Rester). Thêm dòng này vào hàm restler.php trong hàm sendData ($ data) trong đó Trình phục hồi thêm dữ liệu tiêu đề vào phản hồi. Điều này bắt đầu từ dòng 378.

Tuy nhiên, hãy cẩn thận vì điều này sẽ cho phép bất kỳ miền nào lấy dữ liệu từ API của bạn.

Các vấn đề liên quan