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
Đố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();
?>
Đ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
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
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.
- 1. Cuộc gọi tên miền chéo Ajax
- 2. Cuộc gọi AJAX tên miền chéo trong Safari và Chrome
- 3. Yêu cầu miền chéo/tấn công tên miền chéo/giao thức tên miền chéo
- 4. Cuộc gọi tên miền chéo và sự cho phép của JQuery ajax
- 5. Giữ cookie sau khi yêu cầu ajax tên miền chéo
- 6. tên miền chéo AJAX preflighting thất bại xứ séc
- 7. Cuộc gọi Ajax tới tên miền phụ
- 8. Gọi hàm auth cơ bản của tên miền chéo JQuery
- 9. Câu hỏi về yêu cầu ajax tên miền chéo (tên miền phụ)
- 10. Cookie tên miền chéo
- 11. Có phải tên miền chéo chéo AJAX nếu chỉ cổng khác nhau?
- 12. Kiểm tra đăng nhập tên miền chéo?
- 13. jQuery/Ajax - $ .ajax() Chuyển các tham số đến gọi lại - Mẫu tốt để sử dụng?
- 14. vấn đề tên miền chéo với Jquery
- 15. jQuery AJAX với hai tên miền
- 16. backbone.js và tập lệnh tên miền chéo
- 17. Dịch vụ REST tên miền chéo AJAX REST Các tiêu đề HTTP
- 18. jQuery - Cách xóa giới hạn miền chéo
- 19. Theo dõi tên miền chéo cho tên miền phụ với Google Analytics
- 20. Lý do cơ bản đằng sau bảo mật tên miền chéo AJAX là gì?
- 21. Mẫu HTML POST Tên miền chéo
- 22. Tên miền chéo và google CDN cho jquery
- 23. Tên miền chéo Yêu cầu jQuery Ajax & Dịch vụ REST WCF
- 24. Kịch bản iframe tên miền chéo jQuery
- 25. Tên miền chéo trong iframe Safari
- 26. Cuộc gọi jQuery ajax đến miền chuyển hướng đến một tên miền khác (không được theo sau)
- 27. Đề xuất API REST xương sống/tên miền chéo
- 28. cookie tên miền chéo Rails 3
- 29. đặt cookie tên miền chéo với javascript
- 30. Truy cập cửa sổ mẹ từ iframe (tên miền chéo)
Tốt. Tôi tự hỏi, nếu đây là an toàn bảo mật: self :: $ _ GET ['jsonp']? –
Hacking khuôn khổ là allways một ý tưởng tồi ... Điều này là tốt hơn ... – danielrvt
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