Používam Restler implementovať jednoduché REST API. Ak teraz potrebujem konzumovať toto rozhranie API prostredníctvom AJAX z inej domény, musím spolu so svojimi žiadosťami poslať parameter spätného volania. Existuje podpora v službe Restler (musím nájsť skutočnú dokumentáciu)?
odpovede:
5 pre odpoveď č. 1Pre každého, kto na túto stránku príde z googlingu, somodoslal problém na github a od autora dostal vynikajúcu podporu. Ukázalo sa, že implementácia je pomerne triviálna, ak ste oboznámení s tým, ako je postavený Restler.
z 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
}
}
?>
Toto by malo byť uložené v rovnakom adresári ako súbor restler.php. Keď to budete mať, upravte svoju bránu (index.php) tak, aby obsahovala tento súbor, a pridajte ho ako podporovaný formát. Príklad:
<?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 pre odpoveď č. 2
Fungovalo to pre nás dobre: hlavička („Access-Control-Allow-Origin: *“);
Pridajte to k metóde kontroléra pred návratom pre jeden koncový bod, k konštruktoru triedy kontrolóra pre všetky koncové body v tejto vetve alebo vyššie, aby ste umožnili jej umiestnenie na celom webe.
Ak povolíte prístup iba určitým webovým stránkampoužite hlavičku („Access-Control-Allow-Origin: example.com“) alebo niečo podobné hlavičke („Access-Control-Allow-Origin:“. $ remote_domain). Kde je $ remote_domain nastavená dynamicky na základe niektorých odovzdaných v tokene alebo podobne. Pozrite sa na zdieľanie zdrojov krížového pôvodu (CORS), aby ste obmedzili používanie zástupných znakov *.
<?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!";
}
}
Vyššie uvedené práce pre GET a POST, iné akcie vyžadujú niektoré ďalšie informácie o hlavičke od restlera. Tu je niekoľko príkladov:
hlavička („metódy umožňujúce riadenie prístupu: GET, POST, DELETE, PUT, OPTIONS“); header ("Head-Control-Allow-Headers: what_headers_you_allow, header1, header2");
Pre IE9 a novšie budete musieť zaseknúť JSONP. Restler má príklad rozšírenia triedy iFormat tak, aby obalil štýl výstupu JASONP API.
Podrobnosti o hackeroch Mozilla nájdete na stránkach CORS. http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ A pozrite sa MOŽNOSTI v rozhraní API REST PHP
0 pre odpoveď č. 3
Tu pridám, že ak z nejakého dôvodu nechcete používať JSONP, môžete jednoducho pridať:
header("Access-Control-Allow-Origin: *");
za prvú odpoveď na punkael (neurčil ju)kde to urobiť v Resteri). Pridajte tento riadok do restler.php vo funkcii sendData ($ data), kde Restler pridá do odpovede dáta hlavičky. Začína to na riadku 378.
Dajte pozor, pretože to umožní akejkoľvek doméne získavať údaje z vášho rozhrania API.