2011-11-14 14 views

答えて

5

グーグルからこのページに来る人は、githubで問題を提出し、著者から優れたサポートを得ました。 Restlerがどのように構築されているかに精通していれば、実装するのはかなり簡単です。

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

https://github.com/Luracast/Restler/issues/17から、これは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(); 
?> 
+0

ニース。私はこれがセキュリティ上安全であるかどうか疑問に思っています:self :: $ _ ['jsonp']? –

+0

フレームワークをハッキングしようとしているのは間違っています...これはもっと良いことです... – danielrvt

+0

Luracastでは 'Defaults :: $ accessControlAllowHeaders'静的メンバータイプの取引を設定できないはずですか? – Miles

1

これが私たちのためによく働い: ヘッダー( 'アクセス制御 - 許可 - 原産地:*');

単一のエンドポイントを返す前に、コントローラメソッドにこれを追加し、そのブランチ内のすべてのエンドポイントのコントローラクラスコンストラクタに追加します。

特定のサイトだけがヘッダー( 'Access-Control-Allow-Origin:'。$ remote_domain)のような使用ヘッダー( 'Access-Control-Allow-Origin:example.com')または何かにアクセスすることを許可している場合。 $ remote_domainは、トークンなどで渡されたものに基づいて動的に設定されます。 *ワイルドカードの使用を制限する理由については、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のいくつかの追加ヘッダー情報が必要です。以下はいくつかの例です:

ヘッダー( 'アクセス制御許可メソッド:GET、POST、DELETE、PUT、OPTIONS'); ヘッダー( 'アクセス制御許可ヘッダー:whatever_headers_you_allow、ヘッダー1、ヘッダー2');

IE9以下の場合、JSONPハックが必要です。 Restlerには、iFormatクラスを拡張してAPI出力JASONPスタイルをラップする例があります。

CORSの詳細については、Mozillaハックをご覧ください。 http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ そして、チェックアウトOPTIONS in PHP REST API

+0

上記はGETとPOSTに適していますが、他のアクションではいくつかの回避策が必要です。 Mozillaのハックをチェックしてください。 http://hacks.mozilla。org/2009/07/cross-site-xmlhttprequest-with-cors / – punkael

0

私はいくつかの理由のためにあなたがJSONPを使用しない場合、あなたは、単に追加できることをここに追加します:

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

をpunkaelの最初の答えあたりの(彼はしませんでしたResterでこれを行う場所を指定します)。 Restlerがヘッダデータをレスポンスに追加するsendData($ data)関数のrestler.phpにこの行を追加します。これは378行目から始まります。

しかし、これにより、ドメインからAPIのデータを取得できるようになります。

関連する問題