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