Я использую Restler для реализации простого REST API. Теперь, если мне нужно будет использовать этот API через AJAX из другого домена, мне нужно будет отправить параметр обратного вызова вместе с моими запросами. Есть ли поддержка для этого в Restler (я еще не нашел реальной документации)?
Для всех, кто пришел на эту страницу из Google, я отправил вопрос в github и получил отличную поддержку от автора. Оказывается, это довольно тривиально для реализации, если вы знакомы с тем, как создается Restler.
От 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 } } ?>
Это должно быть сохранено в том же каталоге, что и файл restler.php. После этого отредактируйте свой шлюз (index.php), чтобы включить этот файл, и добавьте его в качестве поддерживаемого формата. Пример:
<?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(); ?>
Это сработало для нас: header («Access-Control-Allow-Origin: *»);
Добавьте это к методу контроллера перед возвратом для одной конечной точки, к конструктору класса контроллера для всех конечных точек в этой ветке или выше, чтобы разрешить его на сайте.
Если вы разрешаете определенным сайтам доступ к заголовку использования («Access-Control-Allow-Origin: example.com») или что-то вроде заголовка («Access-Control-Allow-Origin:». $ Remote_domain). Где $ remote_domain устанавливается динамически на основе некоторых переданных в токене или таких. Ознакомьтесь с перекрестным доступом к ресурсам (CORS) для того, чтобы ограничить использование * подстановочного знака.
<?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!"; } }
Вышеприведенные работы для GET и POST, другие действия требуют некоторой дополнительной информации заголовка от restler. Вот некоторые примеры:
header («Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS»); header ('Access-Control-Allow-Headers: whatever_headers_you_allow, header1, header2');
Для IE9 и ниже вам потребуется взломать JSONP. У Restler есть пример расширения класса iFormat для переноса интерфейса JASONP на API.
Ознакомьтесь с Mozilla hacks для получения более подробной информации о CORS. http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ И проверьте OPTIONS в PHP REST API
Я добавлю, что если по какой-то причине вы не хотите использовать JSONP, вы можете просто добавить:
header('Access-Control-Allow-Origin: *');
за первый ответ punkael (он не указал, где это сделать в Rester). Добавьте эту строку в restler.php в функцию sendData ($ data), где Restler добавляет данные заголовка в ответ. Это начинается в строке 378.
Однако будьте осторожны, так как это позволит любому домену захватывать данные из вашего API.