สคริปต์ PHP ไฟล์เดียวที่เพิ่ม REST API ให้กับฐานข้อมูล MySQL/MariaDB, PostgreSQL, SQL Server หรือ SQLite
วิธีการ: อัปโหลด " api.php
" ไปยังเว็บเซิร์ฟเวอร์ของคุณ กำหนดค่าให้เชื่อมต่อกับฐานข้อมูลของคุณ มี REST API ที่มีฟีเจอร์ครบถ้วนทันที
หมายเหตุ: นี่คือการใช้งานอ้างอิง TreeQL ใน PHP
PHP 7.2 หรือสูงกว่าพร้อมไดรเวอร์ PDO ที่เปิดใช้งานสำหรับหนึ่งในระบบฐานข้อมูลเหล่านี้:
MySQL 5.7 / MariaDB 10.0 หรือสูงกว่าสำหรับคุณสมบัติเชิงพื้นที่ใน MySQL
PostgreSQL 9.5 หรือสูงกว่า พร้อม PostGIS 2.2 หรือสูงกว่าสำหรับคุณสมบัติเชิงพื้นที่
SQL Server 2017 หรือสูงกว่า (2019 รองรับ Linux ด้วย)
SQLite 3.16 หรือสูงกว่า (ไม่รองรับคุณสมบัติเชิงพื้นที่)
ดาวน์โหลดไฟล์ " api.php
" จากรุ่นล่าสุด:
https://github.com/mevdschee/php-crud-api/releases/latest หรือโดยตรงจาก:
https://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php
นี่เป็นแอปพลิเคชั่นไฟล์เดียว! อัปโหลด " api.php
" ที่ไหนสักแห่งแล้วสนุกได้เลย!
สำหรับการพัฒนาในพื้นที่ คุณอาจเรียกใช้เว็บเซิร์ฟเวอร์ในตัวของ PHP:
php -S localhost:8080
ทดสอบสคริปต์โดยเปิด URL ต่อไปนี้:
http://localhost:8080/api.php/records/posts/1
อย่าลืมแก้ไขการกำหนดค่าที่ด้านล่างของไฟล์
หรือคุณสามารถรวมโปรเจ็กต์นี้เข้ากับเฟรมเวิร์กเว็บที่คุณเลือกได้ ดู:
REST API อัตโนมัติสำหรับ Laravel
REST API อัตโนมัติสำหรับ Symfony 4
REST API อัตโนมัติสำหรับ SlimPHP 4
ในการบูรณาการเหล่านี้ Composer ใช้เพื่อโหลดโปรเจ็กต์นี้เป็นการขึ้นต่อกัน
สำหรับผู้ที่ไม่ได้ใช้ผู้แต่ง จะมีไฟล์ " api.include.php
" เตรียมไว้ให้ ไฟล์นี้มีทุกอย่างจาก " api.php
" ยกเว้นการกำหนดค่าจาก " src/index.php
" และสามารถใช้งานได้โดยฟังก์ชัน "include" ของ PHP
แก้ไขบรรทัดต่อไปนี้ที่ด้านล่างของไฟล์ " api.php
":
$config = new Config([ 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ]);
นี่คือตัวเลือกการกำหนดค่าทั้งหมดและค่าเริ่มต้นระหว่างวงเล็บ:
"ไดรเวอร์": mysql
, pgsql
, sqlsrv
หรือ sqlite
( mysql
)
"address": ชื่อโฮสต์ (หรือชื่อไฟล์) ของเซิร์ฟเวอร์ฐานข้อมูล ( localhost
)
"พอร์ต": พอร์ต TCP ของเซิร์ฟเวอร์ฐานข้อมูล (ค่าเริ่มต้นเป็นค่าเริ่มต้นของไดรเวอร์)
"username": ชื่อผู้ใช้ของผู้ใช้ที่เชื่อมต่อกับฐานข้อมูล (ไม่มีค่าเริ่มต้น)
"password": รหัสผ่านของผู้ใช้ที่เชื่อมต่อกับฐานข้อมูล (ไม่มีค่าเริ่มต้น)
"database": ฐานข้อมูลที่ทำการเชื่อมต่อ (ไม่มีค่าเริ่มต้น)
"command": SQL พิเศษเพื่อเริ่มต้นการเชื่อมต่อฐานข้อมูล (ไม่มี)
"tables": รายการตารางที่คั่นด้วยเครื่องหมายจุลภาคที่จะเผยแพร่ (ค่าเริ่มต้นคือ 'ทั้งหมด')
"mapping": รายการการแมปตาราง/คอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค (ไม่มีการแมป)
"geometrySrid": SRID ถือว่าเมื่อแปลงจาก WKT เป็นเรขาคณิต ( 4326
)
"middlewares": รายการมิดเดิลแวร์ที่จะโหลด ( cors
)
"controllers": รายการคอนโทรลเลอร์ที่จะโหลด ( records,geojson,openapi,status
)
"customControllers": รายการตัวควบคุมแบบกำหนดเองของผู้ใช้ที่จะโหลด (ไม่มีค่าเริ่มต้น)
"openApiBase": ข้อมูล OpenAPI ( {"info":{"title":"PHP-CRUD-API","version":"1.0.0"}}
)
"cacheType": TempFile
, Redis
, Memcache
, Memcached
หรือ NoCache
( TempFile
)
"cachePath": เส้นทาง/ที่อยู่ของแคช (ค่าเริ่มต้นคือไดเร็กทอรีชั่วคราวของระบบ)
"cacheTime": จำนวนวินาทีที่แคชถูกต้อง ( 10
)
"jsonOptions": ตัวเลือกที่ใช้สำหรับการเข้ารหัส JSON ( JSON_UNESCAPED_UNICODE
)
"debug": แสดงข้อผิดพลาดในส่วนหัว "X-Exception" ( false
)
"basePath": เส้นทางฐาน URI ของ API (กำหนดโดยใช้ PATH_INFO ตามค่าเริ่มต้น)
ตัวเลือกการกำหนดค่าทั้งหมดมีให้เป็นตัวแปรสภาพแวดล้อมด้วย เขียนตัวเลือกการกำหนดค่าด้วยตัวพิมพ์ใหญ่ คำนำหน้า "PHP_CRUD_API_" และขีดเส้นใต้สำหรับการแบ่งคำ เช่น:
PHP_CRUD_API_DRIVER=mysql
PHP_CRUD_API_ADDRESS=localhost
PHP_CRUD_API_PORT=3306
PHP_CRUD_API_DATABASE=php-crud-api
PHP_CRUD_API_USERNAME=php-crud-api
PHP_CRUD_API_PASSWORD=php-crud-api
PHP_CRUD_API_DEBUG=1
ตัวแปรสภาพแวดล้อมมีความสำคัญมากกว่าการกำหนดค่า PHP
ข้อจำกัดและข้อจำกัดเหล่านี้มีผลบังคับใช้:
คีย์หลักควรเป็นการเพิ่มขึ้นอัตโนมัติ (ตั้งแต่ 1 ถึง 2^53) หรือ UUID
ไม่รองรับคีย์หลักและคีย์ต่างประเทศแบบผสม
ไม่รองรับการเขียนที่ซับซ้อน (ธุรกรรม)
ไม่รองรับการเรียกใช้ฟังก์ชันการสืบค้นที่ซับซ้อน (เช่น "concat" หรือ "sum")
ฐานข้อมูลต้องสนับสนุนและกำหนดข้อจำกัดของคีย์ภายนอก
SQLite ไม่สามารถพิมพ์คีย์หลักแบบเพิ่มค่าอัตโนมัติขนาดใหญ่ได้
SQLite ไม่รองรับการแก้ไขคอลัมน์ตาราง (โครงสร้าง)
รองรับคุณสมบัติต่อไปนี้:
การติดตั้งนักแต่งเพลงหรือไฟล์ PHP ไฟล์เดียว ง่ายต่อการปรับใช้
รหัสน้อยมาก ปรับใช้และบำรุงรักษาง่าย
รองรับตัวแปร POST เป็นอินพุต (x-www-form-urlencoded)
รองรับวัตถุ JSON เป็นอินพุต
รองรับอาร์เรย์ JSON เป็นอินพุต (การแทรกแบทช์)
ฆ่าเชื้อและตรวจสอบความถูกต้องของอินพุตโดยใช้กฎประเภทและการโทรกลับ
ระบบอนุญาตฐานข้อมูล ตาราง คอลัมน์ และบันทึก
รองรับโครงร่างฐานข้อมูลเดี่ยวและหลายผู้เช่าหลายราย
รองรับ CORS หลายโดเมนสำหรับคำขอข้ามโดเมน
รองรับการอ่านผลลัพธ์ที่เข้าร่วมจากหลายตาราง
ค้นหาการสนับสนุนในหลายเกณฑ์
การแบ่งหน้า การเรียงลำดับ รายการ N บนสุด และการเลือกคอลัมน์
การตรวจจับความสัมพันธ์พร้อมผลลัพธ์ที่ซ้อนกัน (เป็นของ To, hasMany และ HABTM)
การสนับสนุนการเพิ่มขึ้นของอะตอมผ่าน PATCH (สำหรับตัวนับ)
ฟิลด์ไบนารีที่รองรับการเข้ารหัส base64
ฟิลด์เชิงพื้นที่/GIS และตัวกรองที่รองรับ WKT และ GeoJSON
การแมปชื่อตารางและคอลัมน์เพื่อรองรับระบบเดิม
สร้างเอกสาร API โดยใช้เครื่องมือ OpenAPI
การรับรองความถูกต้องผ่านคีย์ API, โทเค็น JWT หรือชื่อผู้ใช้/รหัสผ่าน
พารามิเตอร์การเชื่อมต่อฐานข้อมูลอาจขึ้นอยู่กับการรับรองความถูกต้อง
รองรับการอ่านโครงสร้างฐานข้อมูลใน JSON
รองรับการแก้ไขโครงสร้างฐานข้อมูลโดยใช้จุดสิ้นสุด REST
รวมมิดเดิลแวร์เสริมความปลอดภัยไว้ด้วย
เป็นไปตามมาตรฐาน: PSR-4, PSR-7, PSR-12, PSR-15 และ PSR-17
โครงการที่เกี่ยวข้อง:
การเริ่มต้นอย่างรวดเร็วของ PHP-CRUD-API: ไฟล์เขียนนักเทียบท่าที่ปรับแต่งได้และพร้อมใช้งานซึ่งมี PHP-CRUD-API
ตัวสร้างตัวกรอง PHP-CRUD-API: ไลบรารี JavaScript ที่สร้างตัวกรอง PHP-CRUD-API จากนิพจน์
JS-CRUD-API: ไลบรารีไคลเอนต์ JavaScript สำหรับ API ของ PHP-CRUD-API
PHP-API-AUTH: สคริปต์ PHP ไฟล์เดียวที่เป็นผู้ให้บริการตรวจสอบสิทธิ์สำหรับ PHP-CRUD-API
PHP-CRUD-UI: สคริปต์ PHP ไฟล์เดียวที่เพิ่ม UI ให้กับโครงการ PHP-CRUD-API
PHP-CRUD-ADMIN: สคริปต์ PHP ไฟล์เดียวที่เพิ่มอินเทอร์เฟซผู้ดูแลระบบฐานข้อมูลให้กับโครงการ PHP-CRUD-API
PHP-SP-API: สคริปต์ PHP ไฟล์เดียวที่เพิ่ม REST API ให้กับฐานข้อมูล SQL
dexie-mysql-sync: การซิงโครไนซ์ระหว่าง IndexedDB ในเครื่องและฐานข้อมูล MySQL
ra-data-treeql: แพ็คเกจ NPM ที่ให้บริการ Data Provider สำหรับ React Admin
scriptPilot/vueuse: Vue Composables นอกเหนือจาก VueUse.org (ที่รองรับ PHP-CRUD-API)
scriptPilot/add-php-backend: เพิ่ม MySQL, phpMyAdmin และ PHP-CRUD-API ให้กับสภาพแวดล้อม dev ของคุณ
VUE-CRUD-UI: สคริปต์ Vue.js ไฟล์เดียวที่เพิ่ม UI ให้กับโครงการ PHP-CRUD-API
นอกจากนี้ยังมีพอร์ตของสคริปต์นี้ใน:
Go-CRUD-API (อยู่ระหว่างดำเนินการ)
Java JDBC โดย Ivan Kolchagov (v1)
Java Spring Boot + jOOQ (v2: อยู่ระหว่างดำเนินการ)
นอกจากนี้ยังมีพอร์ตพิสูจน์แนวคิดของสคริปต์นี้ที่รองรับเฉพาะฟังก์ชัน REST CRUD พื้นฐานใน: PHP, Java, Go, C# .net core, Node.js และ Python
คุณสามารถติดตั้งการขึ้นต่อกันทั้งหมดของโปรเจ็กต์นี้ได้โดยใช้คำสั่งต่อไปนี้:
php install.php
คุณสามารถรวบรวมไฟล์ทั้งหมดเป็นไฟล์ " api.php
" ไฟล์เดียวได้โดยใช้:
php build.php
โปรดทราบว่าคุณไม่ได้ใช้การคอมไพล์เมื่อคุณรวมโปรเจ็กต์นี้เข้ากับโปรเจ็กต์หรือเฟรมเวิร์กอื่น (ใช้ Composer แทน)
คุณสามารถเข้าถึงโค้ดที่ไม่ได้คอมไพล์ได้ที่ URL:
http://localhost:8080/src/records/posts/1
รหัสที่ไม่ได้คอมไพล์อยู่ในไดเร็กทอรี " src
" และ " vendor
" ไดเรกทอรี " vendor
" มีการขึ้นต่อกัน
คุณสามารถอัปเดตการอ้างอิงทั้งหมดของโปรเจ็กต์นี้ได้โดยใช้คำสั่งต่อไปนี้:
php update.php
สคริปต์นี้จะติดตั้งและเรียกใช้ Composer เพื่ออัปเดตการขึ้นต่อกัน
หมายเหตุ: สคริปต์อัปเดตจะแก้ไขการขึ้นต่อกันในไดเร็กทอรีผู้ขายสำหรับความเข้ากันได้ของ PHP 7.0
TreeQL ช่วยให้คุณสร้าง "แผนผัง" ของออบเจ็กต์ JSON ตามโครงสร้างฐานข้อมูล SQL (ความสัมพันธ์) และการสืบค้นของคุณ
มันอิงตามมาตรฐาน REST อย่างหลวม ๆ และได้รับแรงบันดาลใจจาก json:api
ตารางโพสต์ตัวอย่างมีเพียงไม่กี่ช่องเท่านั้น:
posts ======= id title content created
การดำเนินการ CRUD + รายการด้านล่างมีผลกับตารางนี้
หากคุณต้องการสร้างบันทึก คำขอสามารถเขียนในรูปแบบ URL เป็น:
POST /records/posts
คุณต้องส่งเนื้อหาที่มี:
{ "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" }
และมันจะคืนค่าของคีย์หลักของบันทึกที่สร้างขึ้นใหม่:
2
หากต้องการอ่านบันทึกจากตารางนี้ คุณสามารถเขียนคำขอในรูปแบบ URL เป็น:
GET /records/posts/1
โดยที่ "1" คือค่าของคีย์หลักของระเบียนที่คุณต้องการอ่าน มันจะกลับมา:
{ "id": 1 "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }
ในการดำเนินการอ่านคุณสามารถใช้การรวมได้
หากต้องการอัปเดตบันทึกในตารางนี้ คุณสามารถเขียนคำขอในรูปแบบ URL เป็น:
PUT /records/posts/1
โดยที่ "1" คือค่าของคีย์หลักของเรกคอร์ดที่คุณต้องการอัปเดต ส่งเป็นเนื้อความ:
{ "title": "Adjusted title!" }
นี่เป็นการปรับชื่อเรื่องของโพสต์ และค่าที่ส่งคืนคือจำนวนแถวที่ตั้งค่าไว้:
1
หากคุณต้องการลบบันทึกออกจากตารางนี้ คุณสามารถเขียนคำขอในรูปแบบ URL เป็น:
DELETE /records/posts/1
และจะส่งคืนจำนวนแถวที่ถูกลบ:
1
หากต้องการแสดงรายการบันทึกจากตารางนี้ คำขอสามารถเขียนในรูปแบบ URL เป็น:
GET /records/posts
มันจะกลับมา:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" } ] }
ในการดำเนินการรายการคุณสามารถใช้ตัวกรองและการรวมได้
ตัวกรองมีฟังก์ชันการค้นหา ในการเรียกรายการ โดยใช้พารามิเตอร์ "ตัวกรอง" คุณต้องระบุชื่อคอลัมน์ เครื่องหมายจุลภาค ประเภทการจับคู่ เครื่องหมายจุลภาคอื่น และค่าที่คุณต้องการกรอง ประเภทการจับคู่ที่รองรับเหล่านี้:
"cs": มีสตริง (สตริงมีค่า)
"sw": เริ่มต้นด้วย (สตริงเริ่มต้นด้วยค่า)
"ew": ลงท้ายด้วย (สตริงลงท้ายด้วยค่า)
"eq": เท่ากับ (สตริงหรือตัวเลขตรงกันทุกประการ)
"lt": ต่ำกว่า (ตัวเลขต่ำกว่าค่า)
"le": ต่ำกว่าหรือเท่ากัน (ตัวเลขต่ำกว่าหรือเท่ากับค่า)
"ge": มากกว่าหรือเท่ากับ (ตัวเลขสูงกว่าหรือเท่ากับค่า)
"gt": มากกว่า (ตัวเลขสูงกว่าค่า)
"bt": ระหว่าง (ตัวเลขอยู่ระหว่างค่าที่คั่นด้วยเครื่องหมายจุลภาคสองค่า)
"in": in (ตัวเลขหรือสตริงอยู่ในรายการค่าที่คั่นด้วยเครื่องหมายจุลภาค)
"is": เป็นโมฆะ (ฟิลด์มีค่า "NULL")
คุณสามารถลบล้างตัวกรองทั้งหมดได้โดยใส่อักขระ "n" นำหน้า เพื่อให้ "eq" กลายเป็น "neq" ตัวอย่างการใช้ตัวกรองได้แก่:
GET /records/categories?filter=name,eq,Internet GET /records/categories?filter=name,sw,Inter GET /records/categories?filter=id,le,1 GET /records/categories?filter=id,ngt,1 GET /records/categories?filter=id,bt,0,1 GET /records/categories?filter=id,in,0,1
เอาท์พุท:
{ "records":[ { "id": 1 "name": "Internet" } ] }
ในส่วนถัดไป เราจะเจาะลึกถึงวิธีที่คุณสามารถใช้ตัวกรองหลายตัวในการเรียกรายการเดียว
ตัวกรองสามารถทำได้โดยการใช้พารามิเตอร์ "ตัวกรอง" ซ้ำใน URL ตัวอย่างเช่น URL ต่อไปนี้:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
จะขอทุกหมวดหมู่ "โดยที่ id > 1 และ id < 3" หากคุณต้องการ "โดยที่ id = 2 หรือ id = 4" คุณควรเขียน:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
อย่างที่คุณเห็น เราได้เพิ่มตัวเลขลงในพารามิเตอร์ "ตัวกรอง" เพื่อระบุว่าควรใช้ "OR" แทน "AND" โปรดทราบว่าคุณยังสามารถทำซ้ำ "filter1" และสร้าง "AND" ภายใน "OR" ได้ เนื่องจากคุณสามารถเจาะลึกลงไปอีกระดับหนึ่งได้ด้วยการเพิ่มตัวอักษร (af) คุณจึงสามารถสร้างแผนผังเงื่อนไขที่ซับซ้อนได้เกือบทุกแบบ
หมายเหตุ: คุณสามารถกรองได้เฉพาะตารางที่ร้องขอเท่านั้น (ไม่ใช่ในตารางที่รวมไว้) และตัวกรองจะใช้กับการเรียกรายการเท่านั้น
ตามค่าเริ่มต้น คอลัมน์ทั้งหมดจะถูกเลือก ด้วยพารามิเตอร์ "รวม" คุณสามารถเลือกคอลัมน์ที่ต้องการได้ คุณสามารถใช้จุดเพื่อแยกชื่อตารางออกจากชื่อคอลัมน์ ควรคั่นหลายคอลัมน์ด้วยเครื่องหมายจุลภาค เครื่องหมายดอกจัน ("*") อาจใช้เป็นสัญลักษณ์แทนเพื่อระบุ "คอลัมน์ทั้งหมด" คล้ายกับ "include" คุณสามารถใช้พารามิเตอร์ "exclude" เพื่อลบบางคอลัมน์:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
เอาท์พุท:
{ "name": "Internet" }
หมายเหตุ: คอลัมน์ที่ใช้ในการรวมเอนทิตีที่เกี่ยวข้องจะถูกเพิ่มโดยอัตโนมัติและไม่สามารถละเว้นจากเอาต์พุตได้
ด้วยพารามิเตอร์ "order" คุณสามารถจัดเรียงได้ ตามค่าเริ่มต้น การเรียงลำดับจะเรียงลำดับจากน้อยไปมาก แต่การระบุ "desc" จะทำให้สามารถย้อนกลับได้:
GET /records/categories?order=name,desc GET /records/categories?order=id,desc&order=name
เอาท์พุท:
{ "records":[ { "id": 3 "name": "Web development" }, { "id": 1 "name": "Internet" } ] }
หมายเหตุ: คุณสามารถจัดเรียงหลายฟิลด์ได้โดยใช้พารามิเตอร์ "order" หลายตัว คุณไม่สามารถสั่งซื้อในคอลัมน์ "เข้าร่วม"
พารามิเตอร์ "ขนาด" จำกัดจำนวนระเบียนที่ส่งคืน สามารถใช้สำหรับรายการ N อันดับแรกร่วมกับพารามิเตอร์ "order" (ใช้ลำดับจากมากไปน้อย)
GET /records/categories?order=id,desc&size=1
เอาท์พุท:
{ "records":[ { "id": 3 "name": "Web development" } ] }
หมายเหตุ: หากคุณต้องการทราบจำนวนระเบียนทั้งหมด คุณอาจต้องการใช้พารามิเตอร์ "page"
พารามิเตอร์ "หน้า" เก็บหน้าที่ร้องขอ ขนาดหน้าเริ่มต้นคือ 20 แต่สามารถปรับเปลี่ยนได้ (เช่น 50)
GET /records/categories?order=id&page=1 GET /records/categories?order=id&page=1,50
เอาท์พุท:
{ "records":[ { "id": 1 "name": "Internet" }, { "id": 3 "name": "Web development" } ], "results": 2 }
องค์ประกอบ "ผลลัพธ์" ถือเป็นจำนวนระเบียนทั้งหมดในตาราง ซึ่งจะถูกส่งกลับหากไม่มีการใช้การแบ่งหน้า
หมายเหตุ: เนื่องจากเพจที่ไม่ได้เรียงลำดับไม่สามารถแบ่งหน้าได้ เพจจะถูกเรียงลำดับตามคีย์หลัก
สมมติว่าคุณมีตารางโพสต์ที่มีความคิดเห็น (สร้างโดยผู้ใช้) และโพสต์สามารถมีแท็กได้
posts comments users post_tags tags ======= ======== ======= ========= ======= id id id id id title post_id username post_id name content user_id phone tag_id created message
เมื่อคุณต้องการแสดงรายการโพสต์ที่มีความคิดเห็นของผู้ใช้และแท็ก คุณสามารถขอเส้นทาง "ต้นไม้" ได้สองเส้นทาง:
posts -> comments -> users posts -> post_tags -> tags
เส้นทางเหล่านี้มีรูทเดียวกัน และคำขอนี้สามารถเขียนในรูปแบบ URL เป็น:
GET /records/posts?join=comments,users&join=tags
ที่นี่คุณได้รับอนุญาตให้ละเว้นตารางกลางที่ผูกโพสต์กับแท็ก ในตัวอย่างนี้ คุณเห็นว่าความสัมพันธ์ของตารางทั้งสามประเภท (hasMany, BelongsTo และ hasAndBelongsToMany) มีผล:
“โพสต์” มี “ความเห็น” มากมาย
"ความคิดเห็น" เป็นของ "ผู้ใช้"
"โพสต์" มีและเป็นของ "แท็ก" มากมาย
สิ่งนี้อาจนำไปสู่ข้อมูล JSON ต่อไปนี้:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z", "comments": [ { id: 1, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi!" }, { id: 2, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi again!" } ], "tags": [] }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z", "comments": [], "tags": [ { id: 1, message: "Funny" }, { id: 2, message: "Informational" } ] } ] }
คุณจะเห็นว่าตรวจพบความสัมพันธ์ "เป็นของ" และค่าคีย์นอกจะถูกแทนที่ด้วยวัตถุที่อ้างอิง ในกรณีของ "hasMany" และ "hasAndBelongsToMany" ชื่อตารางจะใช้คุณสมบัติใหม่บนวัตถุ
เมื่อคุณต้องการสร้าง อ่าน อัปเดต หรือลบ คุณสามารถระบุค่าคีย์หลักหลายค่าใน URL ได้ คุณต้องส่งอาร์เรย์แทนวัตถุในเนื้อหาคำขอเพื่อสร้างและอัปเดต
หากต้องการอ่านบันทึกจากตารางนี้ คุณสามารถเขียนคำขอในรูปแบบ URL เป็น:
GET /records/posts/1,2
ผลลัพธ์อาจเป็น:
[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
ในทำนองเดียวกัน เมื่อคุณต้องการอัปเดตเป็นชุด คำขอในรูปแบบ URL จะถูกเขียนเป็น:
PUT /records/posts/1,2
โดยที่ "1" และ "2" คือค่าของคีย์หลักของเรกคอร์ดที่คุณต้องการอัปเดต เนื้อหาควรมีจำนวนออบเจ็กต์เท่ากันเนื่องจากมีคีย์หลักใน URL:
[ { "title": "Adjusted title for ID 1" }, { "title": "Adjusted title for ID 2" } ]
นี่เป็นการปรับชื่อเรื่องของโพสต์ และค่าที่ส่งคืนคือจำนวนแถวที่ตั้งค่าไว้:
[1,1]
ซึ่งหมายความว่ามีการดำเนินการอัพเดตสองครั้งและแต่ละการดำเนินการได้ตั้งค่าไว้หนึ่งแถว การดำเนินการแบบแบตช์ใช้ธุรกรรมฐานข้อมูล ดังนั้นการดำเนินการทั้งหมดจะสำเร็จหรือล้มเหลวทั้งหมด (การดำเนินการที่สำเร็จจะถูกย้อนกลับ) หากล้มเหลวเนื้อหาจะมีรายการเอกสารข้อผิดพลาด ในการตอบสนองต่อไปนี้ การดำเนินการแรกสำเร็จและการดำเนินการที่สองของแบตช์ล้มเหลวเนื่องจากการละเมิดความสมบูรณ์:
[ { "code": 0, "message": "Success" }, { "code": 1010, "message": "Data integrity violation" } ]
รหัสสถานะการตอบสนองจะเป็น 424 เสมอ (การขึ้นต่อกันที่ล้มเหลว) ในกรณีที่เกิดความล้มเหลวในการดำเนินการแบบแบตช์อย่างใดอย่างหนึ่ง
หากต้องการแทรกหลายระเบียนลงในตารางนี้ คำขอสามารถเขียนในรูปแบบ URL เป็น:
POST /records/posts
เนื้อหาควรมีอาร์เรย์ของระเบียนที่จะแทรก:
[ { "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
ค่าที่ส่งคืนยังเป็นอาร์เรย์ที่มีคีย์หลักของบันทึกที่แทรกใหม่:
[1,2]
โปรดทราบว่าการดำเนินการแบบแบตช์สำหรับ DELETE เป็นไปตามรูปแบบเดียวกับ PUT แต่ไม่มีเนื้อหา
สำหรับการรองรับเชิงพื้นที่ มีชุดตัวกรองเพิ่มเติมที่สามารถใช้กับคอลัมน์เรขาคณิตและเริ่มต้นด้วย "s":
"sco": มีเชิงพื้นที่ (เรขาคณิตมีอย่างอื่น)
"scr": กากบาทเชิงพื้นที่ (เรขาคณิตตัดกัน)
"sdi": ความไม่ต่อเนื่องเชิงพื้นที่ (เรขาคณิตแยกจากที่อื่น)
"seq": เชิงพื้นที่เท่ากัน (เรขาคณิตเท่ากับอีกอัน)
"บาป": ปริภูมิปริภูมิ (เรขาคณิตตัดกันที่อื่น)
"sov": การทับซ้อนกันเชิงพื้นที่ (เรขาคณิตทับซ้อนกัน)
"sto": สัมผัสเชิงพื้นที่ (เรขาคณิตสัมผัสกัน)
"swi": เชิงพื้นที่ภายใน (เรขาคณิตอยู่ภายในอีกอัน)
"sic": เชิงพื้นที่ปิด (เรขาคณิตปิดและเรียบง่าย)
"sis": เชิงพื้นที่เป็นเรื่องง่าย (เรขาคณิตเป็นเรื่องง่าย)
"siv": เชิงพื้นที่ถูกต้อง (เรขาคณิตถูกต้อง)
ตัวกรองเหล่านี้เป็นไปตามมาตรฐาน OGC และข้อกำหนด WKT ที่ใช้แสดงคอลัมน์เรขาคณิตก็เช่นกัน โปรดทราบว่า SRID ที่ถือว่าเมื่อแปลงจาก WKT เป็นเรขาคณิตจะถูกระบุโดยตัวแปรการกำหนดค่า geometrySrid
และค่าเริ่มต้นเป็น 4326 (WGS 84)
การสนับสนุน GeoJSON เป็นมุมมองแบบอ่านอย่างเดียวบนตารางและบันทึกในรูปแบบ GeoJSON รองรับคำขอเหล่านี้:
method path - operation - description ---------------------------------------------------------------------------------------- GET /geojson/{table} - list - lists records as a GeoJSON FeatureCollection GET /geojson/{table}/{id} - read - reads a record by primary key as a GeoJSON Feature
ตำแหน่งข้อมูล " /geojson
" ใช้ตำแหน่งข้อมูล " /records
" ภายในและรับฟังก์ชันการทำงานทั้งหมด เช่น การรวมและตัวกรอง นอกจากนี้ยังรองรับพารามิเตอร์ "เรขาคณิต" เพื่อระบุชื่อของคอลัมน์เรขาคณิตในกรณีที่ตารางมีมากกว่าหนึ่งรายการ สำหรับมุมมองแผนที่ รองรับพารามิเตอร์ "bbox" ซึ่งคุณสามารถระบุพิกัดด้านซ้ายบนและด้านขวาล่างได้ (คั่นด้วยเครื่องหมายจุลภาค) ประเภทเรขาคณิตต่อไปนี้ได้รับการสนับสนุนโดยการใช้งาน GeoJSON:
จุด
มัลติพอยต์
LineString
MultiLineString
รูปหลายเหลี่ยม
มัลติโพลิกอน
ฟังก์ชัน GeoJSON ถูกเปิดใช้งานตามค่าเริ่มต้น แต่สามารถปิดใช้งานได้โดยใช้การกำหนดค่า "ตัวควบคุม"
เพื่อรองรับการสร้าง API สำหรับ (ส่วนหนึ่งของ) ระบบเดิม (เช่น Wordpress) คุณอาจต้องการแมปชื่อตารางและคอลัมน์เนื่องจากไม่สามารถปรับปรุงได้โดยไม่ต้องเปลี่ยนซอฟต์แวร์ ในขณะที่ชื่ออาจต้องมีการปรับปรุงเพื่อความสอดคล้องกัน การกำหนดค่าช่วยให้คุณสามารถเปลี่ยนชื่อตารางและคอลัมน์ด้วยรายการการแมปที่คั่นด้วยเครื่องหมายจุลภาคซึ่งแยกด้วยเครื่องหมายเท่ากับ เช่นนี้
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
ตัวอย่างเฉพาะนี้จะเปิดเผยตาราง " wp_posts
" ที่จุดสิ้นสุด " posts
" (แทนที่จะเป็น " wp_posts
") และคอลัมน์ " ID
" ภายในตารางนั้นเป็นคุณสมบัติ " id
" (ใช้ตัวพิมพ์เล็กแทนที่จะเป็นตัวพิมพ์ใหญ่)
หมายเหตุ: เนื่องจากการแมปทั้งสองนี้ทับซ้อนกัน การแมปแรก (เฉพาะเจาะจงน้อยกว่า) จึงอาจถูกละเว้น
คุณสามารถเปิดใช้งานมิดเดิลแวร์ต่อไปนี้ได้โดยใช้พารามิเตอร์การกำหนดค่า "มิดเดิลแวร์":
"ไฟร์วอลล์": จำกัดการเข้าถึงที่อยู่ IP ที่ระบุ
"sslRedirect": บังคับเชื่อมต่อผ่าน HTTPS แทน HTTP
"cors": รองรับคำขอ CORS (เปิดใช้งานตามค่าเริ่มต้น)
"xsrf": บล็อกการโจมตี XSRF โดยใช้วิธี 'Double ส่งคุกกี้'
"ajaxOnly": จำกัดคำขอที่ไม่ใช่ AJAX เพื่อป้องกันการโจมตี XSRF
"apiKeyAuth": รองรับ "การตรวจสอบสิทธิ์คีย์ API"
"apiKeyDbAuth": รองรับ "การตรวจสอบฐานข้อมูลคีย์ API"
"dbAuth": รองรับ "การตรวจสอบฐานข้อมูล"
"wpAuth": รองรับ "Wordpress Authentication"
"jwtAuth": รองรับ "การตรวจสอบสิทธิ์ JWT"
"basicAuth": รองรับ "การตรวจสอบสิทธิ์ขั้นพื้นฐาน"
"เชื่อมต่อใหม่": เชื่อมต่อใหม่กับฐานข้อมูลด้วยพารามิเตอร์ที่แตกต่างกัน
"การอนุญาต": จำกัดการเข้าถึงบางตารางหรือคอลัมน์
"การตรวจสอบ": ส่งกลับข้อผิดพลาดในการตรวจสอบอินพุตสำหรับกฎที่กำหนดเองและกฎประเภทเริ่มต้น
"ipAddress": กรอกช่องที่มีการป้องกันด้วยที่อยู่ IP ในการสร้าง
"สุขาภิบาล": ใช้การสุขาภิบาลอินพุตในการสร้างและอัปเดต
"multiTenancy": จำกัดการเข้าถึงของผู้เช่าในสถานการณ์ที่มีผู้เช่าหลายราย
"pageLimits": จำกัดการดำเนินการของรายการเพื่อป้องกันการคัดลอกฐานข้อมูล
"joinLimits": จำกัดพารามิเตอร์การรวมเพื่อป้องกันการคัดลอกฐานข้อมูล
"textSearch": ค้นหาในช่องข้อความทั้งหมดด้วยพารามิเตอร์แบบง่าย
"การปรับแต่ง": จัดเตรียมตัวจัดการสำหรับการปรับแต่งคำขอและการตอบกลับ
"json": รองรับการอ่าน/เขียนสตริง JSON เป็นวัตถุ/อาร์เรย์ JSON
"xml": แปลอินพุตและเอาต์พุตทั้งหมดจาก JSON เป็น XML
พารามิเตอร์การกำหนดค่า "มิดเดิลแวร์" คือรายการมิดเดิลแวร์ที่เปิดใช้งานที่คั่นด้วยเครื่องหมายจุลภาค คุณสามารถปรับแต่งลักษณะการทำงานของมิดเดิลแวร์ได้โดยใช้พารามิเตอร์การกำหนดค่าเฉพาะของมิดเดิลแวร์:
"firewall.reverseProxy": ตั้งค่าเป็น "จริง" เมื่อใช้พร็อกซีย้อนกลับ ("")
"firewall.allowedIpAddresses": รายการที่อยู่ IP ที่ได้รับอนุญาตให้เชื่อมต่อ ("")
"cors.allowedOrigins": ต้นกำเนิดที่อนุญาตในส่วนหัว CORS ("*")
"cors.allowHeaders": ส่วนหัวที่อนุญาตในคำขอ CORS ("ประเภทเนื้อหา, X-XSRF-TOKEN, X-Authorization")
"cors.allowMethods": วิธีการที่อนุญาตในคำขอ CORS ("ตัวเลือก, GET, PUT, POST, DELETE, PATCH")
"cors.allowCredentials": เพื่ออนุญาตข้อมูลประจำตัวในคำขอ CORS ("จริง")
"cors.exposeHeaders": ไวท์ลิสต์ส่วนหัวที่เบราว์เซอร์ได้รับอนุญาตให้เข้าถึง ("")
"cors.maxAge": เวลาที่การให้สิทธิ์ CORS นั้นถูกต้องในหน่วยวินาที ("1728000")
"xsrf.excludeMethods": วิธีการที่ไม่ต้องการการป้องกัน XSRF ("OPTIONS, GET")
"xsrf.cookieName": ชื่อของคุกกี้ป้องกัน XSRF ("XSRF-TOKEN")
"xsrf.headerName": ชื่อของส่วนหัวการป้องกัน XSRF ("X-XSRF-TOKEN")
"ajaxOnly.excludeMethods": วิธีการที่ไม่ต้องใช้ AJAX ("OPTIONS, GET")
"ajaxOnly.headerName": ชื่อของส่วนหัวที่ต้องการ ("X-Requested-With")
"ajaxOnly.headerValue": ค่าของส่วนหัวที่ต้องการ ("XMLHttpRequest")
"apiKeyAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"apiKeyAuth.header": ชื่อของส่วนหัวของคีย์ API ("X-API-Key")
"apiKeyAuth.keys": รายการคีย์ API ที่ถูกต้อง ("")
"apiKeyDbAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"apiKeyDbAuth.header": ชื่อของส่วนหัวของคีย์ API ("X-API-Key")
"apiKeyDbAuth.usersTable": ตารางที่ใช้จัดเก็บผู้ใช้ใน ("ผู้ใช้")
"apiKeyDbAuth.apiKeyColumn": คอลัมน์ตารางผู้ใช้ที่เก็บคีย์ API ("api_key")
"dbAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"dbAuth.usersTable": ตารางที่ใช้จัดเก็บผู้ใช้ใน ("ผู้ใช้")
"dbAuth.loginTable": ตารางหรือมุมมองที่ใช้ในการดึงข้อมูลผู้ใช้สำหรับการเข้าสู่ระบบ ("ผู้ใช้")
"dbAuth.usernameColumn": คอลัมน์ตารางผู้ใช้ที่เก็บชื่อผู้ใช้ ("ชื่อผู้ใช้")
"dbAuth.passwordColumn": คอลัมน์ตารางผู้ใช้ที่เก็บรหัสผ่าน ("รหัสผ่าน")
"dbAuth.returnedColumns": คอลัมน์ที่ส่งคืนเมื่อเข้าสู่ระบบสำเร็จ ว่างเปล่าหมายถึง 'ทั้งหมด' ("")
"dbAuth.usernameFormField": ชื่อของช่องแบบฟอร์มที่เก็บชื่อผู้ใช้ ("ชื่อผู้ใช้")
"dbAuth.passwordFormField": ชื่อของช่องแบบฟอร์มที่เก็บรหัสผ่าน ("รหัสผ่าน")
"dbAuth.newPasswordFormField": ชื่อของฟิลด์แบบฟอร์มที่เก็บรหัสผ่านใหม่ ("newPassword")
"dbAuth.registerUser": ข้อมูลผู้ใช้ JSON (หรือ "1") ในกรณีที่คุณต้องการเปิดใช้งานจุดสิ้นสุด /register ("")
"dbAuth.loginAfterRegistration": 1 หรือศูนย์หากผู้ใช้ที่ลงทะเบียนควรเข้าสู่ระบบหลังจากการลงทะเบียน ("")
"dbAuth.passwordLength": ความยาวขั้นต่ำที่รหัสผ่านต้องมี ("12")
"dbAuth.sessionName": ชื่อของเซสชัน PHP ที่เริ่มต้น ("")
"wpAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"wpAuth.wpDirectory": โฟลเดอร์/เส้นทางที่สามารถติดตั้ง Wordpress ได้ (".")
"wpAuth.usernameFormField": ชื่อของฟิลด์แบบฟอร์มที่เก็บชื่อผู้ใช้ ("ชื่อผู้ใช้")
"wpAuth.passwordFormField": ชื่อของฟิลด์แบบฟอร์มที่เก็บรหัสผ่าน ("รหัสผ่าน")
"jwtAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"jwtAuth.header": ชื่อของส่วนหัวที่มีโทเค็น JWT ("X-Authorization")
"jwtAuth.leeway": จำนวนวินาทีที่ยอมรับได้ของการเอียงของนาฬิกา ("5")
"jwtAuth.ttl": จำนวนวินาทีที่โทเค็นใช้งานได้ ("30")
"jwtAuth.secrets": ความลับที่ใช้ร่วมกันที่ใช้ในการลงนามโทเค็น JWT ด้วย ("")
"jwtAuth.algorithms": อัลกอริธึมที่ได้รับอนุญาต ว่างเปล่า หมายถึง 'ทั้งหมด' ("")
"jwtAuth.audiences": ผู้ชมที่ได้รับอนุญาต ว่างเปล่า หมายถึง 'ทั้งหมด' ("")
"jwtAuth.issuers": ผู้ออกที่ได้รับอนุญาต ว่างเปล่า หมายถึง 'ทั้งหมด' ("")
"jwtAuth.sessionName": ชื่อของเซสชัน PHP ที่เริ่มต้น ("")
"basicAuth.mode": ตั้งค่าเป็น "เป็นทางเลือก" หากคุณต้องการอนุญาตการเข้าถึงแบบไม่ระบุชื่อ ("จำเป็น")
"basicAuth.realm": ข้อความแจ้งเมื่อแสดงการเข้าสู่ระบบ ("ต้องระบุชื่อผู้ใช้และรหัสผ่าน")
"basicAuth.passwordFile": ไฟล์ที่จะอ่านชื่อผู้ใช้/รหัสผ่านรวมกัน (".htpasswd")
"basicAuth.sessionName": ชื่อของเซสชัน PHP ที่เริ่มต้น ("")
"reconnect.driverHandler": ตัวจัดการเพื่อใช้การดึงข้อมูลไดรเวอร์ฐานข้อมูล ("")
"reconnect.addressHandler": ตัวจัดการเพื่อใช้การดึงข้อมูลที่อยู่ฐานข้อมูล ("")
"reconnect.portHandler": ตัวจัดการเพื่อใช้การดึงข้อมูลพอร์ตฐานข้อมูล ("")
"reconnect.databaseHandler": ตัวจัดการเพื่อใช้การดึงชื่อฐานข้อมูล ("")
"reconnect.tablesHandler": ตัวจัดการเพื่อใช้การดึงชื่อตาราง ("")
"reconnect.mappingHandler": ตัวจัดการเพื่อใช้การดึงข้อมูลการแมปชื่อ ("")
"reconnect.usernameHandler": ตัวจัดการเพื่อใช้การดึงข้อมูลชื่อผู้ใช้ฐานข้อมูล ("")
"reconnect.passwordHandler": ตัวจัดการเพื่อใช้การดึงรหัสผ่านฐานข้อมูล ("")
"authorization.tableHandler": ตัวจัดการเพื่อใช้กฎการให้สิทธิ์ตาราง ("")
"authorization.columnHandler": ตัวจัดการเพื่อใช้กฎการให้สิทธิ์คอลัมน์ ("")
"authorization.pathHandler": ตัวจัดการเพื่อใช้กฎการอนุญาตเส้นทาง ("")
"authorization.recordHandler": ตัวจัดการเพื่อใช้กฎตัวกรองการอนุญาตบันทึก ("")
"validation.handler": ตัวจัดการเพื่อใช้กฎการตรวจสอบสำหรับค่าอินพุต ("")
"validation.types": ประเภทที่จะเปิดใช้งานการตรวจสอบประเภท ว่างเปล่า หมายถึง 'ไม่มี' ("ทั้งหมด")
"validation.tables": ตารางสำหรับเปิดใช้งานการตรวจสอบประเภท ว่างเปล่าหมายถึง 'ไม่มี' ("ทั้งหมด")
"ipAddress.tables": ตารางสำหรับค้นหาคอลัมน์ที่จะแทนที่ด้วยที่อยู่ IP ("")
"ipAddress.columns": คอลัมน์สำหรับป้องกันและแทนที่ด้วยที่อยู่ IP ในการสร้าง ("")
"sanitation.handler": ตัวจัดการเพื่อใช้กฎสุขาภิบาลสำหรับค่าอินพุต ("")
"sanitation.types": ประเภทที่จะเปิดใช้งานประเภทสุขาภิบาลสำหรับ ว่างเปล่า หมายถึง 'ไม่มี' ("ทั้งหมด")
"sanitation.tables": ตารางสำหรับเปิดใช้งานประเภทสุขาภิบาล ว่างเปล่า หมายถึง 'ไม่มี' ("ทั้งหมด")
"multiTenancy.handler": ตัวจัดการเพื่อใช้กฎการเช่าหลายรายการแบบง่าย ("")
"pageLimits.pages": หมายเลขหน้าสูงสุดที่การดำเนินการรายการอนุญาต ("100")
"pageLimits.records": จำนวนระเบียนสูงสุดที่ส่งคืนโดยการดำเนินการรายการ ("1000")
"joinLimits.deep": ความลึกสูงสุด (ความยาว) ที่ได้รับอนุญาตในเส้นทางการเข้าร่วม ("3")
"joinLimits.tables": จำนวนตารางสูงสุดที่คุณได้รับอนุญาตให้เข้าร่วม ("10")
"joinLimits.records": จำนวนบันทึกสูงสุดที่ส่งคืนสำหรับเอนทิตีที่เข้าร่วม ("1000")
"textSearch.parameter": ชื่อของพารามิเตอร์ที่ใช้สำหรับคำค้นหา ("ค้นหา")
"customization.beforeHandler": ตัวจัดการเพื่อใช้การปรับแต่งคำขอ ("")
"customization.afterHandler": ตัวจัดการเพื่อใช้การปรับแต่งการตอบสนอง ("")
"json.controllers": ตัวควบคุมในการประมวลผลสตริง JSON สำหรับ ("records,geojson")
"json.tables": ตารางที่จะประมวลผลสตริง JSON สำหรับ ("ทั้งหมด")
"json.columns": คอลัมน์ในการประมวลผลสตริง JSON สำหรับ ("ทั้งหมด")
"xml.types": ประเภท JSON ที่ควรเพิ่มให้กับแอตทริบิวต์ประเภท XML ("null,อาร์เรย์")
หากคุณไม่ระบุพารามิเตอร์เหล่านี้ในการกำหนดค่า ระบบจะใช้ค่าเริ่มต้น (ระหว่างวงเล็บ)
ในส่วนด้านล่าง คุณจะพบข้อมูลเพิ่มเติมเกี่ยวกับมิดเดิลแวร์ในตัว
ขณะนี้มีการรับรองความถูกต้องห้าประเภทที่รองรับ พวกเขาทั้งหมดจัดเก็บผู้ใช้ที่ได้รับการรับรองความถูกต้องใน $_SESSION
super global ตัวแปรนี้สามารถใช้ในตัวจัดการการอนุญาตเพื่อตัดสินใจว่าควรให้ใครก็ตามมีสิทธิ์อ่านหรือเขียนตาราง คอลัมน์ หรือบันทึกบางอย่างหรือไม่ ภาพรวมต่อไปนี้แสดงประเภทของมิดเดิลแวร์การรับรองความถูกต้องที่คุณสามารถเปิดใช้งานได้
ชื่อ | มิดเดิลแวร์ | รับรองความถูกต้องผ่านทาง | ผู้ใช้จะถูกเก็บไว้ใน | ตัวแปรเซสชัน |
---|---|---|---|---|
คีย์เอพีไอ | apiKeyAuth | ส่วนหัว 'X-API-Key' | การกำหนดค่า | $_SESSION['apiKey'] |
ฐานข้อมูลคีย์ API | apiKeyDbAuth | ส่วนหัว 'X-API-Key' | ตารางฐานข้อมูล | $_SESSION['apiUser'] |
ฐานข้อมูล | dbAuth | ปลายทาง '/login' | ตารางฐานข้อมูล | $_SESSION['user'] |
ขั้นพื้นฐาน | การตรวจสอบสิทธิ์ขั้นพื้นฐาน | ส่วนหัว 'การอนุญาต' | ไฟล์ '.htpasswd' | $_SESSION['username'] |
เจดับบลิว | jwtAuth | ส่วนหัว 'การอนุญาต' | ผู้ให้บริการข้อมูลประจำตัว | $_SESSION['claims'] |
ด้านล่างนี้คุณจะพบข้อมูลเพิ่มเติมเกี่ยวกับการรับรองความถูกต้องแต่ละประเภท
การตรวจสอบสิทธิ์คีย์ API ทำงานโดยการส่งคีย์ API ในส่วนหัวของคำขอ ชื่อส่วนหัวมีค่าเริ่มต้นเป็น "X-API-Key" และสามารถกำหนดค่าได้โดยใช้พารามิเตอร์การกำหนดค่า 'apiKeyAuth.header' ต้องกำหนดค่าคีย์ API ที่ถูกต้องโดยใช้พารามิเตอร์การกำหนดค่า 'apiKeyAuth.keys' (รายการที่คั่นด้วยเครื่องหมายจุลภาค)
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
คีย์ API ที่ผ่านการรับรองความถูกต้องจะถูกจัดเก็บไว้ในตัวแปร $_SESSION['apiKey']
โปรดทราบว่าการตรวจสอบสิทธิ์คีย์ API ไม่จำเป็นต้องใช้หรือใช้คุกกี้เซสชัน
การรับรองความถูกต้องฐานข้อมูลคีย์ API ทำงานโดยการส่งคีย์ API ในส่วนหัวคำขอ "X-API-Key" (ชื่อนี้กำหนดค่าได้) คีย์ API ที่ถูกต้องจะถูกอ่านจากฐานข้อมูลจากคอลัมน์ "api_key" ของตาราง "ผู้ใช้" (กำหนดค่าได้ทั้งสองชื่อ)
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
ผู้ใช้ที่ได้รับการรับรองความถูกต้อง (พร้อมคุณสมบัติทั้งหมด) จะถูกจัดเก็บไว้ในตัวแปร $_SESSION['apiUser']
โปรดทราบว่าการรับรองความถูกต้องฐานข้อมูลคีย์ API ไม่จำเป็นต้องใช้หรือใช้คุกกี้เซสชัน
มิดเดิลแวร์การรับรองความถูกต้องของฐานข้อมูลกำหนดเส้นทางใหม่ห้าเส้นทาง:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /register - username, password - adds a user with given username and password POST /login - username, password - logs a user in by username and password POST /password - username, password, newPassword - updates the password of the logged in user POST /logout - - logs out the currently logged in user
ผู้ใช้สามารถเข้าสู่ระบบได้โดยการส่งชื่อผู้ใช้และรหัสผ่านไปยังปลายทางการเข้าสู่ระบบ (ในรูปแบบ JSON) ผู้ใช้ที่ได้รับการรับรองความถูกต้อง (พร้อมคุณสมบัติทั้งหมด) จะถูกจัดเก็บไว้ในตัวแปร $_SESSION['user']
ผู้ใช้สามารถออกจากระบบได้โดยส่งคำขอ POST ด้วยเนื้อหาว่างไปยังปลายทางการออกจากระบบ รหัสผ่านจะถูกจัดเก็บเป็นแฮชในคอลัมน์รหัสผ่านในตารางผู้ใช้ คุณสามารถลงทะเบียนผู้ใช้ใหม่โดยใช้จุดสิ้นสุดการลงทะเบียนได้ แต่ต้องเปิดใช้งานฟังก์ชันนี้โดยใช้พารามิเตอร์การกำหนดค่า "dbAuth.registerUser"
สิ่งสำคัญคือต้องจำกัดการเข้าถึงตารางผู้ใช้โดยใช้มิดเดิลแวร์ 'การอนุญาต' ไม่เช่นนั้นผู้ใช้ทุกคนจะสามารถเพิ่ม แก้ไข หรือลบบัญชีใดๆ ได้อย่างอิสระ! การกำหนดค่าขั้นต่ำแสดงอยู่ด้านล่าง:
'middlewares' => 'dbAuth,authorization', 'authorization.tableHandler' => function ($operation, $tableName) { return $tableName != 'users'; },
โปรดทราบว่ามิดเดิลแวร์นี้ใช้คุกกี้เซสชันและจัดเก็บสถานะการเข้าสู่ระบบบนเซิร์ฟเวอร์
เข้าสู่ระบบโดยใช้มุมมองพร้อมตารางที่เข้าร่วม
สำหรับการเข้าสู่ระบบ คุณสามารถใช้มุมมองเป็น usersTable ได้ มุมมองดังกล่าวสามารถส่งคืนผลลัพธ์ที่ถูกกรองจากตารางผู้ใช้ เช่น โดยที่ active = true หรืออาจส่งคืนผลลัพธ์หลายตารางผ่านการเข้าร่วมตาราง อย่างน้อยที่สุด มุมมองควรมี ชื่อผู้ใช้ และ รหัสผ่าน และฟิลด์ชื่อ id
อย่างไรก็ตาม ไม่สามารถแทรกมุมมองที่มีตารางที่รวมเข้าด้วยกันได้ (ดูปัญหา 907 ) วิธีแก้ปัญหาชั่วคราว ให้ใช้คุณสมบัติ LoginTable เพื่อตั้งค่าตารางอ้างอิงอื่นสำหรับการเข้าสู่ระบบ usersTable จะยังคงถูกตั้งค่าเป็นตารางผู้ใช้ปกติที่สามารถแทรกได้
มิดเดิลแวร์การรับรองความถูกต้อง Wordpress กำหนดเส้นทางสามเส้นทาง:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /login - username, password - logs a user in by username and password POST /logout - - logs out the currently logged in user
ผู้ใช้สามารถเข้าสู่ระบบได้โดยการส่งชื่อผู้ใช้และรหัสผ่านไปยังปลายทางการเข้าสู่ระบบ (ในรูปแบบ JSON) ผู้ใช้สามารถออกจากระบบได้โดยการส่งคำขอ POST ด้วยเนื้อหาว่างไปยังปลายทางการออกจากระบบ คุณต้องระบุไดเร็กทอรีการติดตั้ง Wordpress โดยใช้พารามิเตอร์การกำหนดค่า "wpAuth.wpDirectory" มิดเดิลแวร์เรียก "wp-load.php" ซึ่งช่วยให้คุณใช้ฟังก์ชัน Wordpress ในมิดเดิลแวร์การอนุญาตได้ เช่น:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
โปรดทราบว่ามิดเดิลแวร์นี้ไม่ได้ใช้ตัวแปร $_SESSION
ประเภทพื้นฐานรองรับไฟล์ (โดยค่าเริ่มต้น '.htpasswd') ที่เก็บผู้ใช้และรหัสผ่าน (แฮช) ของพวกเขาโดยคั่นด้วยเครื่องหมายทวิภาค (':') เมื่อป้อนรหัสผ่านในรูปแบบข้อความธรรมดา รหัสผ่านเหล่านั้นจะถูกแฮชโดยอัตโนมัติ ชื่อผู้ใช้ที่ได้รับการรับรองความถูกต้องจะถูกจัดเก็บไว้ในตัวแปร $_SESSION['username']
คุณต้องส่งส่วนหัว "การอนุญาต" ที่มีชื่อผู้ใช้และรหัสผ่านที่เข้ารหัส URL base64 ของชื่อผู้ใช้และรหัสผ่านที่คั่นด้วยโคลอนของคุณ หลังคำว่า "พื้นฐาน"
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
ตัวอย่างนี้ส่งสตริง "username1:password1"
ประเภท JWT ต้องใช้เซิร์ฟเวอร์ (SSO/Identity) อื่นเพื่อลงนามโทเค็นที่มีการอ้างสิทธิ์ เซิร์ฟเวอร์ทั้งสองแบ่งปันความลับเพื่อให้สามารถลงนามหรือตรวจสอบว่าลายเซ็นนั้นถูกต้อง การอ้างสิทธิ์จะถูกจัดเก็บไว้ในตัวแปร $_SESSION['claims']
คุณต้องส่งส่วนหัว "X-Authorization" ที่มีการเข้ารหัส URL base64 และส่วนหัวโทเค็นที่แยกจากจุด เนื้อหา และลายเซ็นหลังคำว่า "ผู้ถือ" (อ่านเพิ่มเติมเกี่ยวกับ JWT ที่นี่) มาตรฐานบอกว่าคุณต้องใช้ส่วนหัว "การอนุญาต" แต่นี่เป็นปัญหาใน Apache และ PHP
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
ตัวอย่างนี้ส่งการอ้างสิทธิ์ที่ลงนามแล้ว:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
หมายเหตุ: การใช้งาน JWT รองรับเฉพาะอัลกอริธึมที่ใช้ RSA และ HMAC เท่านั้น