programming4:api
Khác biệt
Đây là những khác biệt giữa hai phiên bản của trang.
Phiên bản trước của cả hai bênPhiên bản trướcPhiên bản sau | Phiên bản trước | ||
programming4:api [2021/03/22 08:13] – hoaquynhtim99 | programming4:api [2023/12/19 08:14] (hiện tại) – [Lệnh gọi API rewrite (không gọi vào /api.php) lỗi 404] hoaquynhtim99 | ||
---|---|---|---|
Dòng 2: | Dòng 2: | ||
> Hệ thống API được đưa vào kể từ phiên bản 4.5.00 | > Hệ thống API được đưa vào kể từ phiên bản 4.5.00 | ||
+ | |||
+ | Xem mô tả luồng truy vấn thông thường và API như ảnh bên dưới | ||
+ | |||
+ | {{ : | ||
===== Dành cho nhà phát triển sử dụng API ===== | ===== Dành cho nhà phát triển sử dụng API ===== | ||
+ | ==== Lưu ý khi sử dụng API ==== | ||
+ | - Nếu không bắt buộc không nên sử dụng API (Mặc định NukeViet < 4.5 không cung cấp API, bản NukeViet 4.5 trở đi sẽ không kích hoạt mặc định) | ||
+ | - Tại chức năng **Cấu hình => Cấu hình chung** cần Bật **Remote API** | ||
+ | - Quyền truy cập API tại phần **Quản trị => Quyền truy cập API** đã chọn đủ API Role có chứa API cần gọi. | ||
+ | - Cấp quyền ít nhất: Một API Roles chỉ nên có các quyền ít nhất, không nên cấp tất cả các quyền. Quyền có thể được thêm vào khi cần thiết và nên được thu hồi khi không còn được sử dụng. | ||
+ | - Quyền truy cập API, nên được giới hạn theo IP, Xóa Quyền truy cập API nếu không dùng nữa. | ||
+ | - Sử dụng HTTPS cho cả website, trong đó có API | ||
+ | - Nếu phải viết thêm API, hãy viết nó đơn giản: Mỗi khi bạn làm cho giải pháp phức tạp hơn một cách “không cần thiết”, bạn cũng có khả năng để lại một lỗ hổng. | ||
==== Nguyên tắc chung ==== | ==== Nguyên tắc chung ==== | ||
Dòng 14: | Dòng 26: | ||
[ | [ | ||
' | ' | ||
- | 'apisecret' => ' | + | 'timestamp' |
+ | ' | ||
' | ' | ||
' | ' | ||
+ | ' | ||
] | ] | ||
</ | </ | ||
Dòng 52: | Dòng 66: | ||
} | } | ||
+ | $apisecret = ''; | ||
+ | $timestamp = time(); | ||
$request = [ | $request = [ | ||
// Tham số bắt buộc | // Tham số bắt buộc | ||
' | ' | ||
- | 'apisecret' => '...', | + | 'timestamp' => $timestamp, |
+ | | ||
+ | ' | ||
' | ' | ||
' | ' | ||
Dòng 82: | Dòng 100: | ||
<code php> | <code php> | ||
// Các tham số tùy chọn của mỗi API để vào biến $parameters | // Các tham số tùy chọn của mỗi API để vào biến $parameters | ||
+ | $apisecret = ''; | ||
+ | $timestamp = time(); | ||
$parameters = []; | $parameters = []; | ||
$request = [ | $request = [ | ||
// Tham số bắt buộc | // Tham số bắt buộc | ||
' | ' | ||
- | 'apisecret' => '...', | + | 'timestamp' => $timestamp, |
+ | | ||
+ | ' | ||
' | ' | ||
' | ' | ||
Dòng 118: | Dòng 140: | ||
</ | </ | ||
- | |||
- | |||
- | ===== Dành cho nhà phát triển muốn cung cấp remote API ===== | ||
- | |||
- | Để remote api hoạt động cần đảm bảo các yếu tố sau: | ||
- | |||
- | - Tại chức năng **Thiết lập Cross-Site** ở phần **Cấu hình => Thiết lập an ninh** cần tắt bảo vệ ngoài site hoặc thêm tên miền hoặc IP cho phép gọi API | ||
- | - Tại chức năng **Cấu hình => Cấu hình chung** cần Bật **Remote API** | ||
- | - Quyền truy cập API tại phần **Quản trị => Quyền truy cập API** đã chọn đủ API Role có chứa API cần gọi. | ||
==== API của module ==== | ==== API của module ==== | ||
- | |||
- | ====== Module hỗ trợ API ====== | ||
Trong tài liệu này chúng tôi ví dụ module hiện tại là module **page** đang chuẩn bị lập trình chức năng API. | Trong tài liệu này chúng tôi ví dụ module hiện tại là module **page** đang chuẩn bị lập trình chức năng API. | ||
Dòng 210: | Dòng 221: | ||
Giải thích code như sau: | Giải thích code như sau: | ||
- | ===== Namespaces | + | === Namespaces === |
<code php> | <code php> | ||
Dòng 231: | Dòng 242: | ||
use NukeViet\Api\IApi; | use NukeViet\Api\IApi; | ||
</ | </ | ||
- | ===== Class Name ===== | + | === Class Name === |
<code php> | <code php> | ||
Dòng 267: | Dòng 278: | ||
> Lưu ý: Class name chính là tên file. Ví dụ class name là CreatArticle thì file sẽ là '' | > Lưu ý: Class name chính là tên file. Ví dụ class name là CreatArticle thì file sẽ là '' | ||
- | ===== Phương thức getAdminLev | + | === Phương thức getAdminLev === |
Cho biết đối tượng được quyền sử dụng API: | Cho biết đối tượng được quyền sử dụng API: | ||
Dòng 281: | Dòng 292: | ||
<code php> | <code php> | ||
- | Api:: | + | Api:: |
Api:: | Api:: | ||
- | Api:: | + | Api:: |
</ | </ | ||
- | ===== Phương thức getCat | + | === Phương thức getCat === |
Cho biết danh mục của API nếu có, nếu API không được xếp danh mục hãy trả về chuỗi rỗng. | Cho biết danh mục của API nếu có, nếu API không được xếp danh mục hãy trả về chuỗi rỗng. | ||
Dòng 297: | Dòng 308: | ||
</ | </ | ||
- | ===== Phương thức setResultHander | + | === Phương thức setResultHander === |
<code php> | <code php> | ||
Dòng 308: | Dòng 319: | ||
Giữ nguyên code như mẫu, không thay đổi thêm. | Giữ nguyên code như mẫu, không thay đổi thêm. | ||
- | ===== Code thực thi Api ===== | + | === Code thực thi Api === |
<code php> | <code php> | ||
Dòng 321: | Dòng 332: | ||
Code thực thi được viết tự do, và bắt buộc phải trả về thông qua phương thức '' | Code thực thi được viết tự do, và bắt buộc phải trả về thông qua phương thức '' | ||
- | ==== Sử dụng các dữ liệu hệ thống | + | === Sử dụng các dữ liệu hệ thống === |
* Lấy biến '' | * Lấy biến '' | ||
Dòng 330: | Dòng 341: | ||
* Các biến hệ thống như '' | * Các biến hệ thống như '' | ||
- | ==== Cách trả dữ liệu về ==== | + | === Cách trả dữ liệu về === |
Message thông báo: | Message thông báo: | ||
Dòng 361: | Dòng 372: | ||
$this-> | $this-> | ||
</ | </ | ||
+ | |||
+ | ** Bước 3 thêm giá trị api vào file ngôn ngữ của module ** | ||
+ | * $lang_module[' | ||
+ | * $lang_module[' | ||
==== API của hệ thống ==== | ==== API của hệ thống ==== | ||
Dòng 369: | Dòng 384: | ||
* namespace là '' | * namespace là '' | ||
+ | |||
+ | ==== Cách gọi API nội bộ ==== | ||
+ | |||
+ | Ta có thể dùng hàm '' | ||
+ | <code php> | ||
+ | $return = nv_local_api($cmd, | ||
+ | </ | ||
+ | |||
+ | Trong đó: | ||
+ | * $return: là kết quả API trả về | ||
+ | * $cmd: là tương ứng với action khi remote | ||
+ | * $params: là mảng data nó sẽ được chuyển thành biến $_POST | ||
+ | * $adminidentity: | ||
+ | * $module: tương ứng với module khi remote | ||
+ | |||
+ | Ví dụ: Với cách gọi qua CURL thông thường, ta cần phải làm các bước sau: | ||
+ | <code php> | ||
+ | $agent = ' | ||
+ | $safe_mode = (ini_get(' | ||
+ | $open_basedir = ini_get(' | ||
+ | |||
+ | $ch = curl_init(); | ||
+ | curl_setopt($ch, | ||
+ | curl_setopt($ch, | ||
+ | |||
+ | if (!$safe_mode and !$open_basedir) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | $params= [ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | | ||
+ | //Các dữ liệu cần thiết, ví dụ ở đây ta sẽ truyền userid | ||
+ | ' | ||
+ | ]; | ||
+ | |||
+ | $str = http_build_query($request); | ||
+ | curl_setopt($ch, | ||
+ | curl_setopt($ch, | ||
+ | curl_setopt($ch, | ||
+ | curl_setopt($ch, | ||
+ | curl_setopt($ch, | ||
+ | $return = curl_exec($ch); | ||
+ | curl_close($ch); | ||
+ | </ | ||
+ | |||
+ | Với hàm '' | ||
+ | <code php> | ||
+ | $params= [ | ||
+ | ' | ||
+ | ]; | ||
+ | $return = nv_local_api(' | ||
+ | /* | ||
+ | | ||
+ | * $return: Dữ liệu API sẽ trả về | ||
+ | * ' | ||
+ | * $params: Mảng dữ liệu truyền vào API | ||
+ | * ' | ||
+ | * ' | ||
+ | */ | ||
+ | </ | ||
+ | Có thể xem thêm về hàm '' | ||
+ | |||
+ | ===== Gỡ lỗi API ===== | ||
+ | |||
+ | ==== Lệnh gọi API rewrite (không gọi vào /api.php) lỗi 404 ==== | ||
+ | |||
+ | |||
+ | Kiểm tra xem máy chủ có hỗ trợ rewrite hay không là điều kiện đầu tiên. Nếu có hỗ trợ thì check lần lượt các hướng bên dưới. | ||
+ | |||
+ | **Nếu máy chủ sử dụng Apache** | ||
+ | |||
+ | * Tìm trong httpd.conf (hoặc các file config tương đương) thẻ '' | ||
+ | * Tìm trong .htaccess ngay thư mục gốc website nếu không có thì thêm vào đoạn sau | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Options -MultiViews | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * Nếu thêm vào vẫn không hoạt động thì cần cài thêm [[https:// | ||
programming4/api.1616375591.txt.gz · Sửa đổi lần cuối: 2021/03/22 08:13 bởi hoaquynhtim99