Yên tĩnh
Dec 16 2022
.
- Sáu hạn chế của API REST là gì?
- Kiến trúc Máy khách — Máy chủ — Quy tắc này đảm bảo tách biệt các mối quan tâm. Máy khách quản lý các mối quan tâm về giao diện người dùng trong khi Máy chủ quản lý các mối quan tâm về tính bền bỉ của dữ liệu. Đổi lại, chúng tôi có được một hệ thống có tính di động cao, nơi một khi API REST có thể quản lý các máy khách khác nhau.
- Không trạng thái — Không có dữ liệu khách hàng nào có thể được lưu trữ trên máy chủ giữa các yêu cầu. Nếu trạng thái máy khách phù hợp với các yêu cầu, nó phải được gửi cùng với các yêu cầu. Nếu máy chủ cần lưu các phiên máy khách, nó sẽ được lưu trong DB trong một khoảng thời gian nhất định.
- Khả năng lưu vào bộ nhớ cache — Tất cả phản hồi phải được đánh dấu là có thể lưu vào bộ nhớ cache hoặc không thể lưu vào bộ nhớ cache. Nếu phản hồi có thể thay đổi liên tục, chúng ta không nên cache chúng. Khả năng lưu trữ quan trọng đối với hiệu suất của API REST.
- Hệ thống phân lớp — Máy khách không thể biết / không nên quan tâm liệu nó có kết nối trực tiếp với máy chủ gốc hay trung gian trên đường đi hay không. Điều đó có nghĩa là REST cho phép bạn có kiến trúc hệ thống theo lớp và yêu cầu có thể được gửi qua các lớp khác nhau. Điều này giúp bảo mật và khả năng mở rộng (CDN, máy chủ ủy quyền).
- Mã theo yêu cầu — API REST có thể chuyển các tệp JavaScript thực thi và các thành phần đã biên dịch sang máy khách khi cần.
- Giao diện thống nhất - Như tên ngụ ý, cần có một giao diện cho các tài nguyên được hiển thị cho các ứng dụng khách API. Tài nguyên trong máy chủ chỉ nên có một URI logic để truy xuất hoặc thao tác tài nguyên.
- dựa trên kiến trúc client-server
- và muốn phục vụ các khách hàng khác nhau thông qua giao thức HTTP
- và muốn sử dụng các ràng buộc REST được mô tả ở trên
############################################################################
# Movie Apis Definitions #
############################################################################
# Code completion support is available so start typing for available options.
swagger: '2.0'
# This is your document metadata
info:
version: "1.0.1"
title: The movie api
# Describe your paths here
paths:
# This is a path endpoint. Change it.
/movies:
# This is a HTTP operation
get:
# Describe this verb here. Note: you can use markdown
description: Returns all movies
operationId: getMovies
# Expected responses for this operation:
responses:
# Response code
200:
description: Successful response
# A schema describing your response object.
# Use JSON Schema format
schema:
title: ArrayOfMovies
type: array
items:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
post:
description: Add a new movie
operationId: addMovie
parameters:
- name: movie
in: body
description: The new movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'201':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
/movies/{id}:
parameters:
- name: id
in: path
description: ID of the movie
required: true
type: integer
format: int64
get:
description: Returns a single movie
operationId: getMovieById
responses:
200:
description: Successful response
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
put:
description: Update an existing movie
operationId: updateMovieById
parameters:
- name: movie
in: body
description: The movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'200':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
delete:
description: Delete a movie
operationId: deleteMovieById
responses:
'204':
description: Movie deleted
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
definitions:
movie:
type: object
required:
- id
- title
properties:
id:
type: integer
format: int64
title:
type: string
ratings:
type: object
properties:
criticsScore:
type: integer
minimum: 0
maximum: 100
audienceScore:
type: integer
minimum: 0
maximum: 100
criticsConsensus:
type: string
abridgedDirectors:
type: array
items:
type: string
abridgedCast:
type: array
items:
$ref: '#/definitions/cast'
posters:
$ref: '#/definitions/posters'
cast:
type: object
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
characters:
type: array
items:
type: string
posters:
properties:
thumbnail:
type: string
format: uri
profile:
type: string
format: uri
detailed:
type: string
format: uri
original:
type: string
format: uri
- Sử dụng OAuth2 để bảo mật API của bạn.
- Sử dụng mã thông báo Bearer tự động hết hạn để xác thực (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Yêu cầu HTTPS.
- Cân nhắc sử dụng Mã thông báo Web JSON .
- Bắt buộc sử dụng các tiêu đề Loại nội dung và Loại chấp nhận ngay cả khi bạn sử dụng JSON làm mặc định cho cả yêu cầu và phản hồi.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Cấp độ 0: Xác định một URI và tất cả các hoạt động là các yêu cầu POST đối với URI này.
- Cấp độ 1: Tạo các URI riêng cho các tài nguyên riêng lẻ.
- Cấp độ 2: Sử dụng các phương thức HTTP để xác định các hoạt động trên tài nguyên.
- Cấp độ 3: Sử dụng hypermedia (HATEOAS, được mô tả bên dưới).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- Đối với phương thức POST, URI đại diện cho tài nguyên gốc của thực thể mới, chẳng hạn như bộ sưu tập. Ví dụ: để tạo một bộ phim mới, URI có thể là
/api/movies. Máy chủ tạo thực thể và gán cho nó một URI mới, chẳng hạn như/api/movies/6812360. URI này được trả về trong tiêu đề Vị trí của phản hồi. Mỗi khi máy khách gửi yêu cầu, máy chủ sẽ tạo một thực thể mới với URI mới. - Đối với phương thức PUT, URI xác định thực thể. Nếu đã tồn tại một thực thể với URI đó, máy chủ sẽ cập nhật thực thể hiện có với phiên bản trong yêu cầu.
- Kiểm soát bộ đệm — Số giây tối đa (ttl) mà một phản hồi có thể được lưu vào bộ đệm. (
Cache-Control: public, 360hoặcCache-Control: no-store) - Bộ nhớ đệm mạnh giảm thiểu số lượng yêu cầu mà máy chủ nhận được
- Xem xét bộ nhớ đệm yếu thông qua
ETagtiêu đề phản hồi - ETag — Sử dụng hàm băm SHA1 cho phiên bản của tài nguyên. Đảm bảo bao gồm loại phương tiện trong giá trị băm, vì điều đó tạo ra một biểu diễn khác. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Máy khách cần gửi tiêu đề If-None-Match để cơ chế này hoạt động. - Bộ nhớ đệm yếu giảm thiểu công việc mà máy chủ cần thực hiện (chứ không phải số lượng yêu cầu mà máy chủ nhận được)
- Kích hoạt bộ nhớ đệm dựa trên tiêu đề trên tất cả các proxy và máy khách (ví dụ: NGINX, Apache, APIM) để tăng tốc độ và độ mạnh mẽ
- Không có dữ liệu ảnh hưởng đến quyền riêng tư hoặc bảo mật trong URL
- Triển khai mã hóa nội dung trên các điểm cuối xa nhất (trong máy chủ REST, không phải proxy hoặc APIM)
- Khi ký nội dung được sử dụng, điều này được thực hiện sau khi nội dung được mã hóa (tùy chọn).
- Sử dụng tiêu đề Thuật toán ký X để truyền đạt loại ký nội dung (
X-Signing-Algorithm: RS256) - Sử dụng tiêu đề X-SHA256-Checksum để truyền đạt giá trị băm SHA256 của nội dung (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Sử dụng tiêu đề Thuật toán mã hóa X để truyền đạt loại mã hóa nội dung (
X-Encryption-Algorithm: A128CBC-HS256)
- Nhất quán (tránh bất ngờ bằng cách dự đoán được)
- Gắn kết (chỉ liệt kê các điểm cuối có phụ thuộc chức năng)
- Hoàn thành (có tất cả các điểm cuối cần thiết cho mục đích của nó)
- Tối thiểu (không có nhiều điểm cuối hơn mức cần thiết để hoàn thành, không có tính năng)
- Đóng gói (ẩn chi tiết triển khai)
- Lời giải thích của bản thân
- Tài liệu (nếu tự giải thích là không đủ)
- WSO2
- Apigee
- IBM
- phần mềm AG
- Mulesoft

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































