Yii2.0 實現RESTful風格的簡單API
一、建立資料庫
首先,在mysql中建立一個名為yii2basic的資料庫,並建立一張名為player的表。
二、配置
1.app/config/db.php
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
將此處的使用者名稱和密碼更改為本地對應。
2.app/config/web.php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'player'],
],
],
在components下新增url配置。
3.建立.htaccess
在Yii專案下建立.htaccess,在app/web下建立,其內容為:
Options +FollowSymLinks
IndexIgnore /
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
三、建立一個控制器
首先,建立一個控制器類 app\controllers\PlayerController
如下,
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\Player';
public $serializer = 'yii\rest\Serializer';
public function checkAccess()
{
}
}
控制器類擴充套件自 yii\rest\ActiveController。通過指定 yii\rest\ActiveController::modelClass 作為 app\models\player
,
控制器就能知道使用哪個模型去獲取和處理資料。
四、建立一個模型類
然後,建立一個模型類 app\model\Player
如下,
<?php
namespace app\models;
use yii\db\ActiveRecord;
use yii\web\Link;
use yii\web\Linkable;
use yii\helpers\Url;
class Player extends ActiveRecord implements Linkable
{
public function fields()
{
return [
// 欄位名和屬性名相同
'id',
// 欄位名為"email", 對應的屬性名為"email_address"
'username',
'password',
];
}
public function getLinks()
{
return [
Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true),
];
}
}
到此根據官方文件可知已經生成了對應的一系列API,格式參照Yii2.0
RESTful Web服務(1)
通過命令:
curl -i -H "Accept:application/json" "http://localhost/YourAppName/web/players"
會接收到如下的資訊:[
{
"id": 0,
"username": "",
"password": "",
"_links": {
"self": {
"href": "http://localhost/first-Yii/web/player/view?id=0"
}
}
},
{
"id": 1,
"username": "dffdfdfd",
"password": "sdsadsa",
"_links": {
"self": {
"href": "http://localhost/first-Yii/web/player/view?id=1<span style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Hiragino Sans GB', 'Hiragino Sans GB W3', 'WenQuanYi Micro Hei', 'Microsoft YaHei UI', 'Microsoft YaHei', sans-serif; white-space: pre-wrap;">"</span>
}
}
}
]
使用Postman對功能進行測試發現,CURD操作中的CD操作行為正常,但是請求單條記錄的操作的則會返回如下的錯誤:
{
"name": "Exception",
"message": "Calling unknown method: app\\models\\Player::serializeModel()",
"code": 0,
"type": "yii\\base\\UnknownMethodException",
"file": "/Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Component.php",
"line": 285,
"stack-trace": [
"#0 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Serializer.php(137): yii\\base\\Component->__call('serializeModel', Array)",
"#1 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Serializer.php(137): app\\models\\Player->serializeModel()",
"#2 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Controller.php(97): yii\\rest\\Serializer->serialize(Object(app\\models\\Player))",
"#3 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Controller.php(75): yii\\rest\\Controller->serializeData(Object(app\\models\\Player))",
"#4 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Controller.php(156): yii\\rest\\Controller->afterAction(Object(yii\\rest\\ViewAction), Object(app\\models\\Player))",
"#5 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Module.php(454): yii\\base\\Controller->runAction('view', Array)",
"#6 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/web/Application.php(84): yii\\base\\Module->runAction('player/view', Array)",
"#7 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Application.php(375): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
"#8 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/web/index.php(12): yii\\base\\Application->run()",
"#9 {main}"
]
}
報錯提示呼叫了不存在的方法,由Yii2.0
初識 RESTful Serializer可知此處是一個對模型序列化的方法,返回到Controller的宣告中可以發現確實初始化了$serializer變數。可以看出: public function serialize($data)
{
if ($data instanceof Model && $data->serializeModel()) {
return $this->serializeModelErrors($data);
} elseif ($data instanceof Arrayable) {
return $this->serializeModel($data);
} elseif ($data instanceof DataProviderInterface) {
return $this->serializeDataProvider($data);
} else {
return $data;
}
}
應當是此處傳入的$data並沒有serializeModel()方法,查詢serializeModel()的定義,發現app/rest/Serializer::serializeModel();在此處有一個定義,可見傳入的資料並不一定會有serializeModel方法,除非傳入的資料已經是一個app/rest/Serializer的例項,那麼註釋掉$data->serializeModel()這個條件,進行測試,這次並沒有報錯,但是返回了一個空的結果集。-------------------------------------------第一次更新----------------------------------------
這次我對資料庫中沒有的記錄進行了查詢,這次返回的結果給了很大的提示:
{
"name": "Not Found",
"message": "Object not found: 3",
"code": 0,
"status": 404,
"type": "yii\\web\\NotFoundHttpException"
}
確實資料庫中並沒有主鍵為3的這條記錄,所以在資料庫更換主鍵再進行測試,這次以username作為主鍵發現問題依然存在。相關文章
- Gin與Mysql實現簡單Restful風格API實戰示例詳解PRHCMySqlRESTAPI
- Yii2.0 RESTful風格的Controller與ActiveControllerRESTController
- 實現一個簡單的 RESTful APIRESTAPI
- RESTful風格APIRESTAPI
- RESTful api風格介紹RESTAPI
- 基於MySql和Sails.js的RESTful風格的api實現MySqlAIJSRESTAPI
- Yii2.0 RESTful API 認證教程RESTAPI
- Yii2.0 RESTful API 之版本控制RESTAPI
- Yii2.0 RESTful API 之速率限制RESTAPI
- Yii2.0 RESTful API 基礎配置教程RESTAPI
- 簡單說說Restful APIRESTAPI
- 討論下 RESTful 風格 API 的路由設計RESTAPI路由
- Yii2.0 RESTful API 基礎配置教程[轉載]RESTAPI
- SpringBoot整合Redis使用Restful風格實現CRUD功能Spring BootRedisREST
- WebServiceCXF與Restful架構風格簡介WebREST架構
- nodejs實現restful APINodeJSRESTAPI
- RESTful API 為何成為頂流 API 架構風格?RESTAPI架構
- Python 超簡單實現 9 種影像風格遷移Python
- flask restful 風格 API,如何完成 RBAC 許可權控制?FlaskRESTAPI
- 使用 Python 構建一個簡單的 RESTful APIPythonRESTAPI
- .Net Core 開發電商後端API 吃透RESTful風格後端APIREST
- 簡單介紹SpringMVC RESTFul實現列表功能SpringMVCREST
- Yii2.0 初識 RESTful SerializerREST
- 實現一個簡單的 jQuery 的 APIjQueryAPI
- 陣列的七個 API 的簡單實現陣列API
- Yii2.0 RESTful Web服務(3)RESTWeb
- Yii2.0 RESTful Web服務(4)RESTWeb
- 【flask框架】——flask-restful風格Flask框架REST
- Restful簡單理解REST
- 安全優雅的RESTful API簽名實現方案RESTAPI
- SpringBoot使用Swagger2實現Restful APISpring BootSwaggerRESTAPI
- 使用Swashbuckle構建RESTful風格文件REST
- 【SpringMVC】RESTFul簡介以及案例實現SpringMVCREST
- Vue API風格VueAPI
- restful api最佳實踐RESTAPI
- RESTful API 最佳實踐RESTAPI
- DRF使用超連結API實現真正RESTfulAPIREST
- Holer實現外網訪問本地RESTful APIRESTAPI