web-dev-qa-db-ja.com

RESTful APIでクリーンURLを使用する

「クリーンURL」は「レストフルURL」とも呼ばれ、ユーザーフレンドリで純粋な構造であり、クエリ文字列は含まれていません。代わりに、リソースのパスのみが含まれます。

例: "http://Twitter.com/users/show/"+username+".json"

サーバー側の機能に関する質問:

  1. 各ディレクトリに一意のサーバー側APIスクリプトを作成する必要がありますか?

  2. クリーンURL構造($ _GET ['url_structure'])から有用な情報を取得するにはどうすればよいですか?

  3. Twitterが、確かに存在しない.jsonファイルを呼び出すのはなぜですか。要求に応じて生成する必要があります。これはどのように作動しますか?これにより、質問2の答えはイエスであると信じるようになります。

35
Tyler Buchea

1)RecessPHP のようなRESTfulフレームワークを使用する場合、または.htaccessファイルでmod_rewriteルールを使用してリダイレクトする場合ではありません単一のPHPファイル(フロントコントローラーと呼ばれる)へのすべてのAPIリクエスト。

。htaccess

RewriteEngine On
RewriteRule ^/api/ api.php

api.php

$request = $_SERVER['REQUEST_URI'];  //this would be /users/show/abc.json

2)Apacheの書き換えモジュールを使用して、すべてのapiリクエストを特別なPHPを処理するファイルにリダイレクトしますApacheの構成に応じて、元の要求された(RESTful)URLはPHPのサーバー変数に保存されます。$_SERVER['REQUEST_URI']。もちろん、$_GET[]変数をPHPにRESTful URLが含まれていた。

。htaccess

RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2

api.php

$request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc')
$file_type     = $_GET['type'];

$output = get_data_from_db(); //Do your processing here
                              //You can outsource to other files via an include/require

//Output based on request
switch($file_type) {
    case 'json':
        echo json_encode($output);
        break;
    case 'xml':
        echo xml_encode($output); //This isn't a real function, but you can make one
        break;
    default:
        echo $output;
}

3)Twitter(および他の多くのAPI)は、アプリケーションがAPIから期待する形式を提供する便利な方法であるため、これを使用します。すべてのAPIリクエストは、単一のPHPファイルにリダイレクトされます。このファイルは、すべてのファイルを作成し、その内容を出力にエコーします。ファイルは、キャッシュされない限り、サーバーに保存されません) 。


優れたリソース


RecessPHPに関するメモ。それは確かに素晴らしいツールであり、あなたはそれを見ることをお勧めします(おそらくそのソースで物事を処理する方法のアイデアを得るために)が、それは私にとって少し不格好なようです。パス名が特別なコメントで書かれているという事実は、私にとってPHPではないようです。私はこれから遠ざかり、完璧なフレームワークとは言いませんが、それは確かに始まりです。幸運を!

59
Bailey Parker

これは私のために働いた:あなたのウェブサイトのルートにあるhtaccessファイルにこれを入れてください。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]
RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L]
</IfModule>

そして、ページにアクセスすると http:// localhost/api/person/susan にあるファイルが表示されます http:// localhost/api/api .php 使用するレシピページもあります http:// localhost/recipe/edit/2 これをapi.phpファイルに追加します。

<?php
$requestParts = explode('/',$_GET['request']);
$category = $requestParts[0];
$action = $requestParts[1];
$data = $requestParts[2];
if($category == 'recipe'){
    include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php');
}

上記の変数は、カテゴリ:レシピ、アクション:追加または編集、およびレシピのIDである数値または任意のデータを保持します。次に、add_recipe.php内で変数を使用して、レシピを編集しているか追加しているかを判断します。また、APIを使用する場合は、APIと通信するために使用しているajaxリクエストに応じて異なるファイルを含めることができます。

7
PHPGuru

これを試して:

RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]
0
Sony Choudhary