/ / Luracast Restler parámetro de devolución de llamada para AJAX de dominio cruzado - php, resto

Parámetro de devolución de llamada Luracast Restler para dominio cruzado AJAX - php, resto

Estoy usando Restler para implementar una API REST simple. Ahora, si necesito consumir esa API a través de AJAX desde otro dominio, tendré que enviar un parámetro de devolución de llamada junto con mis solicitudes. ¿Hay soporte para esto en Restler (todavía tengo que encontrar alguna documentación real)?

Respuestas

5 para la respuesta № 1

Para cualquiera que venga a esta página de Google, yopresentó un problema en github y obtuvo un excelente apoyo del autor. Resulta que es bastante trivial de implementar, si está familiarizado con cómo se construye Restler.

De 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
}
}
?>

Esto debe guardarse en el mismo directorio que el archivo restler.php. Una vez que tenga eso, edite su puerta de enlace (index.php) para incluir este archivo y agréguelo como un formato compatible. Ejemplo:

<?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 para la respuesta № 2

Esto funcionó bien para nosotros: encabezado ("Access-Control-Allow-Origin: *");

Agregue esto a un método de controlador antes de la devolución de un único punto final, al constructor de clase de controlador para todos los puntos finales en esa rama o superior para permitir que se ubique en todo el sitio.

Si solo estás permitiendo que ciertos sitios accedanuse header ("Access-Control-Allow-Origin: example.com") o algo así como header ("Access-Control-Allow-Origin:". $ remote_domain). Donde $ remote_domain se establece dinámicamente en función de algún token pasado o similar. Consulte Intercambio de recursos de origen cruzado (CORS) para saber por qué limitar el uso de * comodí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!";
}
}

Lo anterior funciona para GET y POST, otras acciones requieren cierta información adicional del encabezado del restaurador. Aquí hay unos ejemplos:

encabezado ("Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS"); header ("Access-Control-Allow-Allow-Headers: whatever_headers_you_allow, header1, header2");

Para IE9 y versiones posteriores, necesitarás un hack JSONP. Restler tiene un ejemplo de extensión de la clase iFormat para envolver el estilo JASONP de salida de API.

Echa un vistazo a los hacks de Mozilla para obtener más información sobre CORS. http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ Y echa un vistazo OPCIONES en PHP REST API


0 para la respuesta № 3

Agregaré aquí que si por alguna razón no quiere usar JSONP, simplemente puede agregar:

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

La primera respuesta de Punkael (no especificódónde hacer esto en Rester). Agregue esta línea a restler.php en la función sendData ($ data) donde Restler agrega los datos del encabezado a la respuesta. Esto comienza en la línea 378.

Sin embargo, tenga cuidado, ya que esto permitirá que cualquier dominio obtenga datos de su API.