API สาธารณะสำหรับนักพัฒนา
ดึงข้อมูลระบบสารสนเทศของมหาวิทยาลัยราชภัฏพระนคร — รายการระบบ สถานะ เวอร์ชัน ความก้าวหน้า และคู่มือ — ไปแสดงในแอปพลิเคชันหรือเว็บของท่านได้ โดยไม่ต้องขอคีย์และไม่ต้องยืนยันตัวตน
https://devtrack.pnru.ac.th/api/public/v1
เริ่มต้นใช้งาน
- ทุกปลายทางเป็น HTTP GET และตอบกลับเป็น JSON (UTF-8) — การเรียกด้วย POST/PUT/DELETE ถูกปฏิเสธเสมอ แม้ผู้เรียกจะล็อกอินเป็นผู้ดูแลระบบก็ตาม
- ไม่ต้องส่ง header ใดเป็นพิเศษ ไม่มี API key และไม่มี token
-
จำกัดการเรียกไว้ที่ 60 ครั้งต่อนาทีต่อหนึ่งไอพี
เกินกว่านั้นจะได้รหัส
429— แอปที่ต้องรีเฟรชถี่ ๆ ควรเก็บผลลัพธ์ไว้ในเครื่องแทนการยิงซ้ำ -
ผลลัพธ์แนบ
Cache-Control: public, max-age=300ข้อมูลที่ได้จึงช้ากว่าของจริงได้ไม่เกินราว 5 นาที -
วันที่อยู่ในรูป ISO-8601 — ชนิด
dateเป็น2026-09-21ส่วนdatetimeเป็น2026-09-21T14:30:00(เขตเวลา Asia/Bangkok) - เรียกจากเบราว์เซอร์ข้ามโดเมนยังไม่ได้ — ขณะนี้ยังไม่ได้เปิด CORS แอปเนทีฟ (Android / iOS / Flutter) และการเรียกจากฝั่งเซิร์ฟเวอร์ใช้ได้ตามปกติ ส่วนเว็บที่รันคนละโดเมนต้องเรียกผ่านฝั่งเซิร์ฟเวอร์ของตนเอง หากต้องการให้เปิด CORS กรุณาแจ้ง itc@pnru.ac.th
รูปแบบผลลัพธ์
ทุกปลายทางห่อผลลัพธ์ด้วยโครงเดียวกัน ข้อมูลจริงอยู่ในช่อง data เสมอ
แอปจึงเขียนตัวแกะผลลัพธ์ชุดเดียวใช้ได้กับทุกปลายทาง
{
"success": true,
"message": "สำเร็จ",
"data": { ... },
"timestamp": "2026-09-21T14:30:00.123"
}
{
"success": false,
"message": "ไม่พบระบบที่เปิดเผย: XXX",
"data": null,
"timestamp": "2026-09-21T14:30:00.123"
}
| ช่อง | ชนิด | ความหมาย |
|---|---|---|
success | boolean | สำเร็จหรือไม่ — ตรวจช่องนี้ก่อนอ่าน data |
message | string | ข้อความภาษาไทย นำไปแสดงต่อผู้ใช้ได้โดยตรง |
data | object | array | null | ข้อมูลจริง รูปร่างต่างกันไปตามปลายทาง |
timestamp | datetime | เวลาที่เซิร์ฟเวอร์ตอบกลับ |
รหัสสถานะและข้อผิดพลาด
| รหัส | ความหมายและสิ่งที่แอปควรทำ |
|---|---|
| 200 | สำเร็จ อ่านข้อมูลจาก data ได้ |
| 400 | พารามิเตอร์ผิดรูปแบบ เช่นส่ง status ที่ไม่มีอยู่จริง
— ตรวจค่าที่ส่งกับตารางค่าคงที่ด้านล่าง |
| 404 | ไม่พบรายการที่ขอ หรือรายการนั้นไม่ได้เปิดเผยสู่สาธารณะ — ทั้งสองกรณีตอบเหมือนกันโดยตั้งใจ แอปควรแสดงว่า "ไม่พบข้อมูล" เท่านั้น |
| 429 | เรียกถี่เกินโควตา — หยุดรอแล้วค่อยลองใหม่ (แนะนำให้ถอยเป็นช่วง ๆ ไม่ใช่ยิงซ้ำทันที) |
| 500 | ข้อผิดพลาดฝั่งเซิร์ฟเวอร์ — ระบบไม่ส่งรายละเอียดภายในออกมา หากพบบ่อยกรุณาแจ้ง itc@pnru.ac.th |
ปลายทางทั้งหมด
สถิติภาพรวม
/api/public/v1/summary
ตัวเลขสรุปของระบบที่เปิดเผยผ่านเอพีไอทั้งหมด เหมาะกับหน้าแรกหรือการ์ดสรุปในแอป ทุกตัวเลขนับจากข้อมูลที่เปิดเผยเท่านั้น จึงไม่บอกใบ้ว่ามีระบบที่ซ่อนอยู่กี่ระบบ
data
— อ็อบเจกต์เดียว
| ช่อง | ชนิด | คำอธิบาย |
|---|---|---|
totalSystems |
number | จำนวนระบบที่เปิดเผยทั้งหมด |
inProduction |
number | จำนวนระบบที่ใช้งานจริงอยู่ |
inDevelopment |
number | จำนวนระบบที่อยู่ระหว่างพัฒนา |
releasesThisYear |
number | จำนวนเวอร์ชันที่ออกในปีนี้ |
รายการระบบงาน (แบ่งหน้า)
/api/public/v1/systems
รายการระบบที่เปิดเผยผ่านเอพีไอ ค้นหาและกรองตามสถานะได้ ใช้ทำหน้ารายการหลักของแอป ผลลัพธ์เป็นข้อมูลแบบแบ่งหน้า รายการจริงอยู่ใน data.content
| ชื่อ | ชนิด | บังคับ | คำอธิบาย |
|---|---|---|---|
keyword |
string | ไม่บังคับ | คำค้นในชื่อระบบหรือรหัสระบบ |
status |
enum AppStatus | ไม่บังคับ | กรองเฉพาะสถานะที่ต้องการ เช่น PRODUCTION |
page |
number | ไม่บังคับ | หน้าที่ต้องการ เริ่มนับจาก 0 (ค่าเริ่มต้น 0) |
size |
number | ไม่บังคับ | จำนวนรายการต่อหน้า ค่าเริ่มต้น 20 และถูกจำกัดไว้ไม่เกิน 100 |
data
— อ็อบเจกต์แบบแบ่งหน้า — รายการจริงอยู่ใน data.content
| ช่อง | ชนิด | คำอธิบาย |
|---|---|---|
content[] |
array | อาร์เรย์ของระบบงานในหน้านี้ |
content[].id |
number | รหัสอ้างอิงภายในของระบบ |
content[].appCode |
string | รหัสระบบ ใช้เป็นกุญแจเรียกปลายทางรายละเอียด |
content[].displayName |
string | ชื่อที่ใช้แสดง (ภาษาไทย) |
content[].nameEn |
string | null | ชื่อภาษาอังกฤษ |
content[].summary |
string | null | คำอธิบายย่อ 1-2 บรรทัด |
content[].appType |
enum AppType | ประเภทของระบบ |
content[].status |
enum AppStatus | สถานะปัจจุบัน |
content[].iconClass |
string | null | ชื่อคลาสไอคอน Bootstrap Icons ที่ผู้ดูแลกำหนดไว้ เช่น bi-mortarboard |
content[].progressPercent |
number | ความก้าวหน้า 0-100 |
content[].currentVersion |
string | null | เวอร์ชันปัจจุบัน |
content[].lastReleaseDate |
date | null | วันที่ออกเวอร์ชันล่าสุด |
content[].goLiveDate |
date | null | วันที่เปิดใช้งานจริง |
content[].orgName |
string | null | หน่วยงานเจ้าของระบบ |
content[].userGroups[] |
array of enum UserGroup | กลุ่มผู้ใช้งานของระบบ มีได้มากกว่าหนึ่งกลุ่ม เช่น ["STD","ADV"] ใช้กรองว่าผู้ใช้ของแอปคุณเกี่ยวข้องกับระบบนี้หรือไม่ |
content[].urls[] |
array | ลิงก์ที่เปิดเผยของระบบนี้ — เฉพาะลิงก์ของ PRODUCTION ชนิดหน้าหลัก/เอกสาร ที่ผู้ดูแลติ๊กเปิดเผยไว้รายรายการ ระบบที่ยังไม่ติ๊กลิงก์ใดไว้จะได้อาร์เรย์ว่าง |
content[].urls[].url |
string | ที่อยู่เต็มของลิงก์ พร้อมนำไปเปิดได้ทันที |
content[].urls[].label |
string | ข้อความสำหรับแสดงบนปุ่ม เช่น "เข้าใช้งานระบบ" (ไม่ได้ตั้งไว้จะได้ค่า "เข้าใช้งาน") |
content[].urls[].urlType |
enum UrlType | ชนิดของลิงก์ MAIN = หน้าเข้าใช้งาน, DOC = เอกสาร/คู่มือออนไลน์ |
totalElements |
number | จำนวนระบบทั้งหมดตามเงื่อนไขที่ค้น |
totalPages |
number | จำนวนหน้าทั้งหมด |
number |
number | เลขหน้าปัจจุบัน เริ่มจาก 0 |
size |
number | จำนวนรายการต่อหน้าที่ใช้จริง |
first / last |
boolean | เป็นหน้าแรก / หน้าสุดท้ายหรือไม่ |
รายละเอียดระบบงาน 1 ระบบ
/api/public/v1/systems/{code}
ข้อมูลเต็มของระบบหนึ่งระบบ พร้อมประวัติเวอร์ชัน หมุดหมายโครงการ และประกาศ ใช้ทำหน้ารายละเอียดในแอป — ระบบที่ไม่ได้เปิดเผยตอบ 404 เหมือนกับระบบที่ไม่มีอยู่จริง จึงไม่สามารถใช้ปลายทางนี้เดาว่ามีระบบใดซ่อนอยู่
| ชื่อ | ชนิด | บังคับ | คำอธิบาย |
|---|---|---|---|
code |
string (อยู่ในเส้นทาง) | ต้องระบุ | รหัสระบบจากช่อง appCode เช่น THESIS-SEARCH |
data
— อ็อบเจกต์เดียว
| ช่อง | ชนิด | คำอธิบาย |
|---|---|---|
app |
object | ข้อมูลระบบ โครงเดียวกับรายการใน /systems |
app.urls[] |
array | ลิงก์ที่เปิดเผยของระบบนี้ แต่ละรายการมี url, label และ urlType |
versions[] |
array | ประวัติเวอร์ชัน เรียงจากใหม่ไปเก่า แต่ละรายการมี versionNo, versionType, releaseDate, note และ changes[] |
versions[].changes[] |
array | หัวข้อการเปลี่ยนแปลงของเวอร์ชันนั้น มี changeType และ title |
milestones[] |
array | หมุดหมายโครงการ มี title, phase, status, progressPercent, plannedEnd |
announcements[] |
array | ประกาศที่ยังมีผลของระบบนี้ มี title, content, noticeType, startAt, endAt, pinned |
ความก้าวหน้าของโครงการ
/api/public/v1/progress
โครงการที่ยังพัฒนาไม่เสร็จ พร้อมหมุดหมายรายขั้น ใช้ทำหน้าติดตามความคืบหน้าในแอป
data
— อาร์เรย์
| ช่อง | ชนิด | คำอธิบาย |
|---|---|---|
appCode |
string | รหัสระบบ |
displayName |
string | ชื่อที่ใช้แสดง |
orgName |
string | null | หน่วยงานเจ้าของ |
progressPercent |
number | ความก้าวหน้ารวม 0-100 |
milestones[] |
array | หมุดหมายของโครงการ มี title, phase, status, progressPercent, plannedEnd |
ระบบแยกตามกลุ่มผู้ใช้งาน
/api/public/v1/user-groups
ระบบที่ใช้งานจริง (PRODUCTION) จัดกลุ่มตามผู้ใช้ เช่น นักศึกษา อาจารย์ บุคลากร พร้อมลิงก์เข้าใช้งาน ใช้ทำหน้ารวมลิงก์ระบบสำหรับเผยแพร่ — ระบบหนึ่งอยู่ได้หลายกลุ่ม และระบบที่ยังไม่ได้ระบุกลุ่มผู้ใช้ (OTH) จะไม่ปรากฏในปลายทางนี้
| ชื่อ | ชนิด | บังคับ | คำอธิบาย |
|---|---|---|---|
group |
enum UserGroup | ไม่บังคับ | เอาเฉพาะกลุ่มเดียว เช่น STD (ไม่ระบุ = ทุกกลุ่ม) |
data
— อาร์เรย์ — หนึ่งรายการต่อหนึ่งกลุ่ม เรียงเป็น EXT, ADV, STD, USR เสมอ กลุ่มที่ไม่มีระบบได้ systems เป็นอาร์เรย์ว่าง
| ช่อง | ชนิด | คำอธิบาย |
|---|---|---|
group |
enum UserGroup | รหัสกลุ่มผู้ใช้ เช่น STD |
label |
string | ชื่อกลุ่มภาษาไทย เช่น "นักศึกษา" |
systems[] |
array | ระบบที่กลุ่มนี้ใช้งานได้ เรียงตามชื่อ |
systems[].appCode |
string | รหัสระบบ |
systems[].displayName |
string | ชื่อที่ใช้แสดง |
systems[].summary |
string | null | คำอธิบายย่อ |
systems[].iconClass |
string | null | ชื่อคลาสไอคอน Bootstrap Icons |
systems[].url |
string | null | ลิงก์หน้าเข้าใช้งาน (ลิงก์ MAIN อันแรก) null เมื่อผู้ดูแลยังไม่ได้ติ๊กเปิดเผยลิงก์ไว้ |
systems[].urls[] |
array | ลิงก์ที่เปิดเผยทั้งหมด มี url, label และ urlType |
ค่าคงที่ (enum)
JSON ส่งมาเฉพาะรหัสตัวพิมพ์ใหญ่ ไม่ได้ส่งคำแปลไทยมาด้วย แอปที่ต้องการแสดงภาษาไทยให้ใช้ตารางนี้เป็นตัวแปล และควรเผื่อกรณีเจอรหัสที่ยังไม่รู้จักไว้ด้วย เพราะอาจมีค่าใหม่เพิ่มในอนาคต
PLANNING |
วางแผน |
DEVELOPING |
กำลังพัฒนา |
UAT |
ทดสอบกับผู้ใช้ |
PRODUCTION |
ใช้งานจริง |
MAINTENANCE |
ปรับปรุง/บำรุงรักษา |
RETIRED |
ยกเลิกใช้งาน |
WEB |
เว็บแอปพลิเคชัน |
API |
เว็บเซอร์วิส/API |
MOBILE |
แอปพลิเคชันมือถือ |
DESKTOP |
โปรแกรมบนเครื่อง |
SERVICE |
บริการเบื้องหลัง |
BATCH |
งานประมวลผลตามเวลา |
OTH |
ไม่ระบุ |
STD |
นักศึกษา |
ADV |
อาจารย์ |
USR |
บุคลากร |
EXT |
บุคคลภายนอก |
MAJOR |
ปรับใหญ่ |
MINOR |
เพิ่มความสามารถ |
PATCH |
แก้ไขย่อย |
HOTFIX |
แก้ด่วน |
FEATURE |
เพิ่มฟีเจอร์ |
IMPROVEMENT |
ปรับปรุง |
BUGFIX |
แก้ข้อผิดพลาด |
SECURITY |
ความปลอดภัย |
DOCUMENT |
เอกสาร |
MAIN |
หน้าหลัก |
DOC |
เอกสาร/คู่มือ |
ANALYSIS |
วิเคราะห์ |
DESIGN |
ออกแบบ |
DEVELOPMENT |
พัฒนา |
TESTING |
ทดสอบ |
UAT |
ทดสอบกับผู้ใช้ |
DEPLOY |
ติดตั้งใช้งาน |
TRAINING |
อบรม |
CLOSED |
ปิดโครงการ |
NOT_STARTED |
ยังไม่เริ่ม |
IN_PROGRESS |
กำลังดำเนินการ |
DONE |
เสร็จแล้ว |
DELAYED |
ล่าช้า |
ON_HOLD |
ระงับชั่วคราว |
INFO |
ข่าวสาร |
MAINTENANCE |
ปิดปรับปรุง |
INCIDENT |
เหตุขัดข้อง |
RELEASE |
เวอร์ชันใหม่ |
ตัวอย่างโค้ด
curl -s "https://devtrack.pnru.ac.th/api/public/v1/systems?status=PRODUCTION&size=5"
const BASE = 'https://devtrack.pnru.ac.th/api/public/v1';
async function fetchSystems() {
const res = await fetch(BASE + '/systems?status=PRODUCTION&size=20');
if (res.status === 429) throw new Error('เรียกถี่เกินโควตา กรุณารอสักครู่');
if (!res.ok) throw new Error('เรียก API ไม่สำเร็จ: ' + res.status);
const body = await res.json();
if (!body.success) throw new Error(body.message);
return body.data.content; // อาร์เรย์ของระบบงาน
}
import 'dart:convert';
import 'package:http/http.dart' as http;
const base = 'https://devtrack.pnru.ac.th/api/public/v1';
Future<List<dynamic>> fetchSystems() async {
final res = await http.get(Uri.parse('$base/systems?size=20'));
if (res.statusCode != 200) {
throw Exception('เรียก API ไม่สำเร็จ: ${res.statusCode}');
}
// ต้องถอดรหัสเป็น UTF-8 เอง มิฉะนั้นภาษาไทยจะกลายเป็นอักขระเพี้ยน
final body = jsonDecode(utf8.decode(res.bodyBytes));
if (body['success'] != true) throw Exception(body['message']);
return body['data']['content'] as List<dynamic>;
}
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://devtrack.pnru.ac.th/api/public/v1/summary"))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
เงื่อนไขการใช้ข้อมูล
- ข้อมูลที่ API นี้ให้ คือข้อมูลชุดเดียวกับที่แสดงบนหน้าเว็บสาธารณะ ระบบที่ผู้ดูแลยังไม่ได้ติ๊กเปิดเผยจะไม่ปรากฏในผลลัพธ์ใดเลย
- API นี้ ไม่เปิดเผย ไอพี ชื่อเครื่อง พอร์ต ระบบปฏิบัติการ ที่อยู่ repository ชื่อผู้พัฒนา อีเมล หรือเบอร์โทรใด ๆ
- กรุณาอ้างอิงแหล่งที่มาเมื่อนำข้อมูลไปเผยแพร่ต่อ และไม่นำไปใช้ในทางที่ทำให้ เข้าใจสถานะการให้บริการของมหาวิทยาลัยผิดไปจากความจริง
- สอบถามการใช้งาน ขอเพิ่มปลายทาง หรือขอเปิด CORS สำหรับโดเมนของท่าน ติดต่อสำนักวิทยบริการและเทคโนโลยีสารสนเทศ โทร 0-2544-8000 ต่อ 1100 · อีเมล itc@pnru.ac.th