Параметр обратного вызова 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.