HTTP & FHIR REST API
Last updated
Last updated
HIR (Fast Healthcare Interoperability Resources) là tiêu chuẩn trao đổi dữ liệu y tế được phát triển bởi HL7 International. FHIR kết hợp các ưu điểm của các tiêu chuẩn HL7 trước đó (v2.x, v3, CDA) và áp dụng các phương pháp hiện đại dựa trên web RESTful API. Bài viết này sẽ phân tích chi tiết về cách FHIR sử dụng HTTP để xây dựng REST API.
FHIR REST API sử dụng các phương thức HTTP tiêu chuẩn để thao tác với tài nguyên y tế. Mỗi phương thức có vai trò và quy tắc sử dụng riêng.
GET được sử dụng để đọc (truy xuất) tài nguyên FHIR. Đây là phương thức phổ biến nhất và là phương thức duy nhất mà mọi server FHIR đều phải hỗ trợ.
Ví dụ:
Các biến thể GET:
Read: Lấy một tài nguyên cụ thể theo ID
Vread: Lấy một phiên bản cụ thể của tài nguyên
Search: Tìm kiếm tài nguyên theo các tham số
History: Lấy lịch sử thay đổi của tài nguyên
Capabilities: Lấy thông tin về khả năng của server
Đặc điểm:
Idempotent (thực hiện nhiều lần cho kết quả giống nhau)
Không thay đổi dữ liệu trên server
Có thể được cache
POST được sử dụng để tạo tài nguyên mới hoặc thực hiện các hoạt động phức tạp.
Ví dụ tạo tài nguyên mới:
Các biến thể POST:
Create: Tạo tài nguyên mới
Transaction/Batch: Xử lý nhiều tài nguyên trong một request
Operation: Thực hiện các hoạt động tùy chỉnh (ví dụ: $everything
, $validate
)
Search: Tìm kiếm phức tạp với nhiều tham số
Đặc điểm:
Không idempotent (có thể tạo ra nhiều tài nguyên khi thực hiện nhiều lần)
Thay đổi dữ liệu trên server
Không được cache
PUT được sử dụng để cập nhật tài nguyên hiện có hoặc tạo tài nguyên với ID được chỉ định.
Ví dụ:
Đặc điểm:
Idempotent (thực hiện nhiều lần cho kết quả giống nhau)
Yêu cầu phải chứa toàn bộ tài nguyên (không cập nhật một phần)
Client cần biết ID của tài nguyên
Thay thế hoàn toàn tài nguyên hiện có
DELETE được sử dụng để xóa tài nguyên FHIR. Trong FHIR, việc xóa có thể là "logical delete" (đánh dấu là đã xóa nhưng vẫn giữ trong lịch sử) hoặc "physical delete" (xóa hoàn toàn).
Ví dụ:
Đặc điểm:
Idempotent (thực hiện nhiều lần cho kết quả giống nhau)
Server có thể từ chối xóa tài nguyên nếu có ràng buộc tham chiếu
Nhiều server FHIR thực hiện "logical delete" thay vì xóa hoàn toàn
PATCH được sử dụng để cập nhật một phần tài nguyên. Đây là phương thức tùy chọn trong FHIR và không phải tất cả server đều hỗ trợ.
Ví dụ sử dụng JSON Patch:
Đặc điểm:
Không idempotent (kết quả phụ thuộc vào trạng thái hiện tại của tài nguyên)
Chỉ cập nhật các trường được chỉ định
FHIR hỗ trợ nhiều định dạng patch: JSON Patch, FHIRPath Patch, XML Patch
FHIR sử dụng các mã trạng thái HTTP tiêu chuẩn để truyền đạt kết quả của các hoạt động API. Hiểu được các mã này là cần thiết để xử lý lỗi và xác nhận thành công trong ứng dụng FHIR.
200
OK
Request thành công và response chứa tài nguyên được yêu cầu (GET, PUT, POST-search)
201
Created
Tài nguyên mới đã được tạo thành công (POST, PUT)
202
Accepted
Request đã được chấp nhận để xử lý bất đồng bộ
204
No Content
Request thành công nhưng không có nội dung trả về (DELETE)
304
Not Modified
Tài nguyên không thay đổi kể từ lần GET trước (với ETag)
400
Bad Request
Request không hợp lệ (ví dụ: JSON/XML không đúng định dạng)
401
Unauthorized
Authentication cần thiết nhưng không được cung cấp
403
Forbidden
Người dùng đã xác thực nhưng không có quyền truy cập
404
Not Found
Tài nguyên không tồn tại
405
Method Not Allowed
Phương thức HTTP không được hỗ trợ cho tài nguyên này
409
Conflict
Xung đột khi cập nhật tài nguyên (ví dụ: version mismatch)
412
Precondition Failed
Điều kiện tiên quyết không thỏa mãn (thường liên quan đến version)
422
Unprocessable Entity
Tài nguyên không vượt qua validation
429
Too Many Requests
Client gửi quá nhiều requests (rate limiting)
500
Internal Server Error
Lỗi server không xác định
501
Not Implemented
Server không hỗ trợ chức năng được yêu cầu
503
Service Unavailable
Server tạm thời không khả dụng (quá tải hoặc bảo trì)
504
Gateway Timeout
Server FHIR không nhận được response kịp thời từ upstream server
Khi có lỗi, FHIR thường trả về tài nguyên OperationOutcome
để cung cấp thông tin chi tiết về lỗi.
Ví dụ:
FHIR sử dụng nhiều HTTP headers để điều khiển hành vi của API và cung cấp metadata.
Content-Type
Định dạng của dữ liệu trong request body
Content-Type: application/fhir+json
Accept
Định dạng dữ liệu mong muốn trong response
Accept: application/fhir+json
Authorization
Thông tin xác thực (thường là token)
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5...
If-None-Match
Chỉ trả về nếu khác với ETag đã cho
If-None-Match: W/"3"
If-Modified-Since
Chỉ trả về nếu thay đổi sau thời điểm
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
If-Match
Chỉ thực hiện nếu version/ETag khớp
If-Match: W/"2"
Prefer
Tùy chọn xử lý cho server
Prefer: return=minimal
Content-Type
Định dạng của dữ liệu trong response body
Content-Type: application/fhir+json; charset=utf-8
Location
URI của tài nguyên mới tạo
Location: https://server.example.com/fhir/Patient/123456/_history/1
ETag
Version identifier của tài nguyên
ETag: W/"3"
Last-Modified
Thời điểm tài nguyên được cập nhật lần cuối
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
Content-Location
Canonical URL của tài nguyên được trả về
Content-Location: https://server.example.com/fhir/Patient/123456
X-FHIR-Request-ID
ID duy nhất cho request (tracing)
X-FHIR-Request-ID: 60e0b5d2-c396-4be7-a614-9b3476631051
X-FHIR-Forwarded-For
Tương tự như X-Forwarded-For
X-FHIR-Forwarded-For: 203.0.113.195
Cấu trúc của request và response FHIR tuân theo chuẩn HTTP với một số quy ước đặc biệt.
1. URL Structure:
FHIR URL có cấu trúc chung như sau:
Ví dụ:
https://server.example.com/fhir/Patient
- Tất cả bệnh nhân
https://server.example.com/fhir/Patient/123456
- Bệnh nhân cụ thể
https://server.example.com/fhir/Patient?name=nguyễn&gender=male
- Tìm kiếm
https://server.example.com/fhir/Patient/123456/_history/2
- Version cụ thể
https://server.example.com/fhir/Patient/123456/$everything
- Operation
2. Headers:
3. Body (cho POST, PUT, PATCH):
1. Headers:
2. Body:
Khi trả về nhiều tài nguyên (ví dụ từ một search), FHIR sử dụng tài nguyên Bundle:
FHIR sử dụng các loại Bundle khác nhau cho các mục đích khác nhau:
searchset
Kết quả của một search operation
transaction
Tập hợp các requests thực hiện như một giao dịch
batch
Tập hợp các requests thực hiện tuần tự
history
Lịch sử của tài nguyên
document
Bundle đại diện cho một tài liệu lâm sàng
message
Bundle đại diện cho một FHIR message
collection
Collection của các tài nguyên
FHIR REST API dựa trên các nguyên tắc HTTP chuẩn nhưng thêm vào các quy tắc và quy ước đặc biệt cho dữ liệu y tế. Hiểu rõ cách sử dụng các HTTP methods, status codes, headers, và cấu trúc request/response là nền tảng để phát triển và tích hợp thành công với các hệ thống FHIR.
Các điểm quan trọng cần nhớ:
FHIR sử dụng các phương thức HTTP tiêu chuẩn (GET, POST, PUT, DELETE, PATCH) với ngữ nghĩa rõ ràng
Các mã trạng thái HTTP cung cấp thông tin quan trọng về kết quả của request
HTTP headers được sử dụng rộng rãi để kiểm soát hành vi và cung cấp metadata
Các tài nguyên FHIR có thể được biểu diễn dưới nhiều định dạng (JSON, XML) với cấu trúc chuẩn
Trong phần tiếp theo của series, chúng ta sẽ tìm hiểu sâu hơn về các loại tài nguyên FHIR, các tương tác phức tạp, và cách triển khai FHIR trong các dự án y tế thực tế.