0

REST のいくつかの概念について少し混乱しています。説明をいただければ幸いです。私はこのチュートリアルに従っているので、使用するコードはすべてそこからのものです。 http://phpmaster.com/rest-can-you-do-more-than-spell-it-3/

1)。データを投稿したいときはいつでも、curl トランザクションのこの手順全体を実行する必要がありますか?

<?php
// set up the URI value involved in a variable
$uri = "http://www.funland.com/summerschedule";

// set up the data that is going to be passed
$events = array(
array("event" => "20120601-0001",
      "name"  => "AC/DC Drink Till U Drop Concert",
      "date"  => "20120601",
      "time"  => "22000030"),
array("event" => "20120602-0001",
      "name"  => "Enya – Can You Feel the Peace",
      "date"  => "20120602",  
      "time"  => "19300045"),
array("event" => "20120603-0002",
      "name"  => "Nicki Menaj – The Midnight Girls Concerrtt",
      "date"  => "20120603",  
      "time"  => "21300039"));
$jsonData = json_encode($events) 

// perform the curl transaction
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

$response = curl_exec($ch); 
$decode = json_decode($response);
print_r($resonse);

2. リンクを作成するときはいつでも、URI に関して何か特別なことをしなければなりませんか? それとも、アクセス方法に従ってフォーマットするだけですか?

www.example.com/restaurant/42 へのリンクを作成するには、次のリンクを作成しますか?

//assuming $resource = restaurant in this example

<a href ="www.example.com/".$resource."/".$id">Item 42</a>

3. URL のパスを解析するコードは、すべてのファイルに含まれていますか?それとも、ファイル (api.php など) を作成して、それを各ファイルに含めるだけですか?

<?php
// assume autoloader available and configured
$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$path = trim($path, "/");
@list($resource, $params) = explode("/", $path, 2);

$resource = ucfirst(strtolower($resource));
$method = strtolower($_SERVER["REQUEST_METHOD"]);
$params = !empty($params) ? explode("/", $params) : array();

if (class_exists($resource)) {
   try {
     $resource = new $resource($params);
     $resource->{$method}();
}
catch (Exception $e) {
    header("HTTP/1.1 500 Internal Server Error");
}
}
else {
  header("HTTP/1.1 404 File Not Found");
}

4. 特定のクラスの各関数に使用できる「動詞」はどこで設定できますか? 次のコードは、上記のリンク先のチュートリアルのパート 2 からのものです。クラス コンストラクターがあるようですが、関数ごとに受け入れられるアクションを指定する必要がありますか? このコードを誤解しているのかもしれませんが、Restaurant/id のようなものでは DELETE が受け入れられないと言っている箇所がわかりません。

<?php
abstract class Resource
{
    protected static $httpMethods = array("GET", "POST", "HEAD",
    "PUT", "OPTIONS", "DELETE", "TRACE", "CONNECT"); 

protected $params;

public function __construct(array $params) {
    $this->params = $params;
}

protected function allowedHttpMethods() {
    $myMethods = array();
    $r = new \ReflectionClass($this);
    foreach ($r->getMethods(\ReflectionMethod::IS_PUBLIC) as $rm) {
        $myMethods[] = strtoupper($rm->name);
    }
    return array_intersect(self::$httpMethods, $myMethods);

}

public function __call($method, $arguments) {
    header("HTTP/1.1 405 Method Not Allowed", true, 405);
    header("Allow: " . join($this->allowedHttpMethods(), ", "));
}
}
4

2 に答える 2

2

順番に:

  1. cURL 全体をカプセル化する関数を作成できます。

  2. $resource$id指すかはわかりませんが、そのように理にかなっているようです。http://URL はまたはで始まる必要があることに注意してくださいhttps://

  3. このコードは典型的なルーターのように見え、リクエストごとに呼び出されるはずです。クラスが自動的に読み込まれるように、そのコードの前にオートローダーを設定してください。

  4. すべてのリソース クラスは、その基本クラスから拡張されます。クラスで作成することによりpublic function get() { }、ルーターはメソッドの場合にそのメソッドを自動的に呼び出しますGET。実装しないものはすべて実行さ__call()れ、REST クライアントにエラー コードが提供されます。

于 2012-08-28T14:57:30.617 に答える
0

Q4 への回答 - 私のお気に入りのアプローチは、HTTP プロセスを表すインターフェイスを作成method_exists()し、呼び出されたリソースでメソッドを実行する前に、使用してそのインターフェイスに対してチェックすることです。

// declaring the methods
interface HTTP {
    public function get();
    public function post();
    public function put();
    ....
}

// checking if the attempted method is allowable
method_exists('HTTP', $method);
于 2012-08-28T14:59:42.173 に答える