Параметр обратного вызова Luracast Restler для междоменного AJAX - PullRequest
6 голосов
/ 14 ноября 2011

Я использую Restler для реализации простого REST API. Теперь, если мне нужно использовать этот API через AJAX из другого домена, мне нужно будет отправить параметр обратного вызова вместе с моими запросами. Есть ли поддержка для этого в Рестлере (я еще не нашел никакой реальной документации)?

Ответы [ 3 ]

5 голосов
/ 16 ноября 2011

Для тех, кто заходит на эту страницу из 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();
?>
1 голос
/ 04 декабря 2011

Это хорошо сработало для нас: заголовок ('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, другие действия требуют дополнительной информации заголовка от рестлера. Вот несколько примеров:

header ('Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS'); header ('Access-Control-Allow-Headers: what_headers_you_allow, header1, header2');

Для IE9 и ниже вам понадобится взломать JSONP. В Restler есть пример расширения класса iFormat для переноса выходного стиля API JASONP.

Проверьте взломы Mozilla для получения подробной информации о CORS. http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ И посмотрите ОПЦИИ в PHP REST API

0 голосов
/ 20 июля 2012

Я добавлю сюда, что если по какой-то причине вы не хотите использовать JSONP, вы можете просто добавить:

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

за первый ответ punkael (он не указал, где это сделатьв рестере).Добавьте эту строку в restler.php в функции sendData ($ data), где Restler добавляет данные заголовка в ответ.Это начинается со строки 378.

Будьте осторожны, так как это позволит любому домену получать данные из вашего API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...