Yiiは、RESTful WebサービスAPIの実装タスクを簡素化するためのツールセットを提供します。特に、YiiはRESTful APIに関する以下の機能をサポートしています。
OPTIONS
およびHEAD
動詞の組み込みサポート。以下では、最小限のコーディング作業でRESTful APIのセットを構築する方法を例を挙げて説明します。
RESTful API経由でユーザーデータを公開したいと仮定します。ユーザーデータはuser
DBテーブルに保存されており、ユーザーデータにアクセスするためにアクティブレコードクラスapp\models\User
を既に作成しているとします。
まず、次のようにコントローラクラスapp\controllers\UserController
を作成します。
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
コントローラクラスはyii\rest\ActiveControllerから拡張され、これは一般的なRESTfulアクションのセットを実装します。modelClassをapp\models\User
として指定することにより、コントローラはデータの取得と操作に使用できるモデルを認識します。
次に、アプリケーション設定でurlManager
コンポーネントの設定を変更します。
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
上記の構成では、主にuser
コントローラのURLルールを追加して、きれいなURLと意味のあるHTTP動詞を使用してユーザーデータにアクセスおよび操作できるようにします。
注意: Yiiは、エンドポイントで使用するためにコントローラ名を自動的に複数形にします(以下の試してみるセクションを参照)。これは、yii\rest\UrlRule::$pluralizeプロパティを使用して設定できます。
APIがJSON形式の入力データを受け入れられるようにするには、JSON入力にyii\web\JsonParserを使用するように、request
アプリケーションコンポーネントのparsersプロパティを設定します。
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
]
情報: 上記の設定はオプションです。上記の設定がない場合、APIは
application/x-www-form-urlencoded
およびmultipart/form-data
入力形式のみを認識します。
上記の最小限の作業で、ユーザーデータにアクセスするためのRESTful APIの作成タスクを既に完了しています。作成したAPIには以下が含まれます。
GET /users
: ユーザーをページごとに一覧表示します。HEAD /users
: ユーザー一覧の概要情報を表示します。POST /users
: 新しいユーザーを作成します。GET /users/123
: ユーザー123の詳細を返します。HEAD /users/123
: ユーザー123の概要情報を表示します。PATCH /users/123
および PUT /users/123
: ユーザー123を更新します。DELETE /users/123
: ユーザー123を削除します。OPTIONS /users
: エンドポイント/users
に関するサポートされている動詞を表示します。OPTIONS /users/123
: エンドポイント/users/123
に関するサポートされている動詞を表示します。次のように、curl
コマンドでAPIにアクセスできます。
$ curl -i -H "Accept:application/json" "https:///users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http:///users?page=1>; rel=self,
<http:///users?page=2>; rel=next,
<http:///users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
許容されるコンテンツタイプをapplication/xml
に変更すると、結果がXML形式で返されることがわかります。
$ curl -i -H "Accept:application/xml" "https:///users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
<id>1</id>
...
</item>
<item>
<id>2</id>
...
</item>
...
</response>
次のコマンドは、JSON形式のユーザーデータを含むPOSTリクエストを送信することにより、新しいユーザーを作成します。
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" \
-XPOST "https:///users" \
-d '{"username": "example", "email": "user@example.com"}'
HTTP/1.1 201 Created
...
Location: http:///users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8
{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789}
ヒント: WebブラウザーでURL
https:///users
を入力してAPIにアクセスすることもできます。ただし、特定の要求ヘッダーを送信するには、ブラウザーのプラグインが必要になる場合があります。
ご覧のとおり、レスポンスヘッダーには、合計件数、ページ数などの情報が含まれています。また、他のデータページに移動できるリンクもあります。たとえば、https:///users?page=2
は、ユーザーデータの次のページを提供します。
fields
およびexpand
パラメーターを使用すると、結果に含める必要があるフィールドを指定することもできます。たとえば、URL https:///users?fields=id,email
は、id
とemail
フィールドのみを返します。
情報:
https:///users
の結果には、password_hash
、auth_key
などの機密フィールドが含まれていることに気づいたかもしれません。これらのフィールドをAPIの結果に表示させたくないことは確かです。 リソースセクションで説明されているように、これらのフィールドを結果から削除することができます。
さらに、https:///users?sort=email
やhttps:///users?sort=-email
のようにコレクションをソートすることもできます。 https:///users?filter[id]=10
やhttps:///users?filter[email][like]=gmail.com
のようにコレクションをフィルタリングすることも、データフィルターを使用して実装できます。詳細については、コレクションのフィルタリングセクションを参照してください。
モデルリストのデフォルトのページネーションおよびソートを変更するには、コントローラーでyii\rest\IndexActionを構成できます。例:
<?php
namespace app\controllers;
use yii\rest\ActiveController;
use yii\helpers\ArrayHelper;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
public function actions()
{
return ArrayHelper::merge(parent::actions(), [
'index' => [
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'defaultOrder' => [
'created_at' => SORT_DESC,
],
],
],
]);
}
}
ActiveControllerのアクションを構成する方法の詳細については、ActiveControllerの拡張を参照してください。
Yii RESTful APIフレームワークを使用すると、コントローラーアクションの観点からAPIエンドポイントを実装し、コントローラーを使用して、単一タイプのリソースのエンドポイントを実装するアクションを整理します。
リソースは、yii\base\Modelクラスから拡張されたデータモデルとして表されます。データベース(リレーショナルまたはNoSQL)を操作している場合は、ActiveRecordを使用してリソースを表すことをお勧めします。
yii\rest\UrlRuleを使用して、APIエンドポイントへのルーティングを簡略化できます。
必須ではありませんが、保守を容易にするために、Webフロントエンドおよびバックエンドとは異なる、独立したアプリケーションとしてRESTful APIを開発することをお勧めします。
タイプミスを見つけたり、このページを改善する必要があると思われますか?
githubで編集 !
JSONを返すには、レスポンスに追加してください。
**components' => [
*//other config...* 'response' => [ 'format' => yii\web\Response::FORMAT_JSON, 'charset' => 'UTF-8', // ... ],** * //other config...*
デフォルト設定では、リクエストヘッダーに基づいてXMLまたはJSONが返されます。ブラウザから開くとXMLが返され、次のヘッダーを使用するとJSONが返されます:Accept:application / json; q = 1.0、*/ *; q = 0.1
サードパーティの開発者が形式を選択する自由度が高くなるため、より良い方法です。
404エラー-このチュートリアルに従うと。
リクエストされたURLがこのサーバーで見つかりませんでした。
N00b向けに、より具体的なコード例と情報を追加する必要があります。
基本のYii2アプリ(およびこのチュートリアルを進めるときに作成されるアプリ)では、
app\models\User
モデルがアプリの構成でidentityClass
として使用されているため、この例は最適ではありません。代わりに、データベースの操作セクションの一部として開発された、app\models\Countryモデルに基づいてこのチュートリアルを作成する必要があるのではないでしょうか。少なくとも上記についてユーザーに警告する必要があるのではないでしょうか?
@hawkwyndが述べているように、このチュートリアルにはバグがあります。
'enableStrictParsing' => true
を有効にすると、アプリケーション全体が動作を停止し、事実上すべてのリクエスト(https:///を含む)で404をスローします。 REST関連のリクエストだけでなく、アプリケーション全体が動作しません。'enableStrictParsing' => false
を設定した場合(または、この構成項目のデフォルトがfalse
であるため、この行を削除した場合)、RESTの例と残りのアプリケーションの両方が問題なく動作します。'enableStrictParsing' => true
を有効にするとこれらの問題が発生する理由を理解しようとしましたが、失敗し、最終的にその行をコメントアウトすることになりました。@Trejder それが動作を停止する理由は、このオプションが明示的に宣言されたURLルートのみを解析することを意味するためです。おそらく何も宣言していないため、何も機能しません。このオプションは、たとえば、許可したいのが特定API呼び出しだけで、他には何も許可したくない場合に使用されます。
コメントするには、サインアップまたはログインしてください。