Tư vấn thiết kế API

Chào các bạn, mình không biết nên chọn cách nào để build app quản lí phòng khám nhờ các bạn tư vấn giúp :
CÁCH 1

                                                                      SERVER 3
                                                                +-------------+                  +-----------+
                                                   JSON         |             |                  |           |
                                                                |   SERVER    |                  |   TRÌNH   |
                                                    +-----------+   ĐỂ CHẠY   +------------------+   DUYỆT   |
                                                    |   API     |   WEB-APP   |                  |           |
                                SERVER 2            |           |             |                  +-----------+
         +--------+          +------------+         |           +-------------+                      |----|
         |        |          |            +---------+                                             +----------+
         |        |          |            |
SERVER 1 |DATABASE|          |WEB SERVICES|
         |        |          |            |
         |        +----------+            |
         |        |          |            |
         +--------+          +--------+---+
                                      |                        +---------------+
                                      |                        |               |
                                      |                        |  APP MOBILE   |
                                      |            API         |  (ANDROID)    |
                                      +------------------------+               |
                                                               |               |
                                                  JSON         |               |
                                                               +---------------+

CÁCH 2

                                                              +--------------+
                                                              |              |
                                                              |    TRÌNH     |
                                                 +------------+    DUYỆT     |
                                                 |            |              |
                                SERVER 2         |            +----+-----+---+
         +--------+          +------------+      |                 |     |
         |        |          |            +------+              +--+-----+--+
         |        |          |            |
SERVER 1 |DATABASE|          |WEB SERVICES|
         |        |          |            |
         |        +----------+            |
         |        |          |            |
         +--------+          +--------+---+
                                      |                        +---------------+
                                      |                        |               |
                                      |                        |  APP MOBILE   |
                                      |            API         |  (ANDROID)    |
                 (HTTPS)              +------------------------+               |
                                                               |               |
                                                  JSON         |               |
                                                               +---------------+

Database mình đã có sẵn rồi, doamin, server thì mình cũng đã chuẩn bị, tầm 4,5 server (share hosting) giao diện web (reactJS + bootstrap) và app android (kotlin) cũng đều hoàn thành rồi. Giờ chỉ chờ phần backend. App phục vụ khoản 50 user trở xuống ạ, truy cập đồng thời khoảng 10 (hiệu năng không quan trọng chỉ cần tính năng, sau này nâng cấp sau)

:point_right: :point_right: :point_right: Các bạn tư vấn giúp mình code Web services như thế nào để đạt chuẩn RESTful với (trước giờ mình chưa bao giờ đụng đến API :cold_sweat:) Webservices mình chọn C#.
1. Có phải code làm sao cho server 2 (trong ảnh) trả về JSON là được rồi đúng k0 ?
VD : https://phongkhamnhakhoa.com/api/xem-danh-sach-benh-nhan/page-1/token=dfsdjfjfpfpfpfasdaskdpsakdapdskdsapđsdsadá
thì server sẽ trả về

{
  "danh-sach-benh-nhan": [
    {
      "id": 4241,
      "infor": {
        "name": "Nguyen van A",
        "age": 30,
        "benh-an": "3321434"
      }
    },
    {
      "id": 4234,
      "infor": {
        "name": "Nguyen van B",
        "age": 20,
        "benh-an": "3332434"
      }
    },
    {
      "id": 4234,
      "infor": {
        "name": "Nguyen van C",
        "age": 35,
        "benh-an": "332r434"
      }
    }
  ]
}

Rồi từ JSON này giao diện web và app sẽ hiện thị ra.
Như vậy có đúng không ạ ?
2. Có nên phân loại ra các method GET,POST, PUT, HEAD, DELETE trong HTTP không ? mình định chỉ dùng POST với GET thôi. cái nào xem thì GET, còn thêm, sửa xóa thì POST, vậy có ổn không ?
3 . Còn về bảo mật API thì sao ? mình định fix cứng 1 token VD : hash SĐT+ngày sinh của mình sau đó mỗi request gọi API web và app phải gửi kèm token này và server sẽ check token để làm việc tiếp.

Cảm ơn các bạn đã tư vấn. (tuy hệ thống nhỏ nhưng mình không muốn “dồn code thành 1 cục” mà muốn code sao cho flexible nhất, tách ra từng module, mỗi module chỉ làm một việc.)

1 Like

A post was split to a new topic: [Bug] Bị mất tag cũ khi thêm tag mới vào bài

bạn có thể giải thích cho mình lý do vì sao bạn muốn làm như vậy không?

  1. nếu bạn không thấy cách 2 có vấn đề gì thì cứ chọn cách 2 thôi, tại sao phải tốn thêm 1 “server”
  2. để đơn giản thì post/get thôi cũng không thành vấn đề
  3. bảo mật này là tùy vào nhu cầu của bạn thôi, mình vẫn chưa hiểu “fix cứng 1 token VD : hash SĐT+ngày sinh của mình có tác dụng bảo mật gì, chống lại được nguy cơ gì? mình không có tác dụng gì cả
4 Likes

Vì mình muốn server 2 (trong ảnh) chỉ xử lý với database và trả về JSON, server 3 thì điều hướng giao diện từ kết quả của server 2 gửi lên, gộp chung mình sợ phức tạp.

  1. Mình sợ người khác bắt được request sẽ sử dụng API trái phép, nên muốn thêm vào 1 mã token để server biết đúng là chủ của nó đang sử dụng. ( nhưng có thể token này vẫn xem được :disappointed_relieved:)

theo bạn thì người khác bắt được api thì sẽ bắt được gì? có bắt được token của bạn không?

theo bạn nói thì bạn đang dùng reactjs + bootstrap (combo này có vẻ không được ổn cho lắm) để làm giao diện web, vậy code reactjs chạy ở đâu? trình duyệt hay server 3?

2 Likes

Mình nghĩ là có, người khác sẽ insert, update, delete database của mình.

Render ở server 3 ạ

1 Like

nếu như vậy thì bạn có thêm token với không thêm token cũng đâu có ý nghĩa gì đâu, bạn cần xem lại cách bảo mật

nếu là bạn render ở server 3 thì đúng là có thể thiết kế như vậy, và cũng hợp lý

tuy nhiên

  • web/app của bạn chỉ có 50 người sử dụng
  • cần đến 3 server để deploy
  • chuẩn restfull

mình có tí nhận xét: web/app của bạn có vẻ như chỉ sử dụng nội bộ, nhưng bạn lại đặt ra nhiều mục tiêu về mặt tech theo kiểu quá chuyên nghiệp, mình dùng chữ “quá” là vì có những cái không thật sự cần thiết với project của bạn, thậm chí chỉ là lý thuyết, thay vì focus vào những vấn đề đó thì bạn nên tập trung vào làm rồi cải thiện sau nếu cần
thực tế là project lớn hơn cũng chưa chắc cần như vậy

à, còn một vấn đề muốn hỏi chơi thôi, được thì bạn trả lời (để xem bạn hiểu đến mức nào thôi)
server là gi?

4 Likes

theo mình hiểu thì trong mô hình client-server thì server là máy chủ cung cấp tài nguyên, dịch vụ cho yêu cầu từ client. Client là trình duyệt web và app mobile, thao tác người dùng sẽ gửi request lên cho server xử lý rồi response về cho client hiển thị. Mình định chia nhỏ server ra. server có thể là dedicated server, share hosting, VPS, …)

1 Like

Cách 1. hay 2 điều được, nhưng vơi lương user thế thi dùng cách 1 cho đơn giản. Server 3 chi là reactjs/bootrap thôi đúng ko(static file)?
Về REST nên dùng đủ bộ: GET,POST,DELETE,PUT. viết theo chuẩn openAPI(ver 3.0, đọc để biết).

User can duoc cấp key khi login, có thể dùng JWT

5 Likes

Thấy bạn cũng nhiệt tình tìm hiểu và trao đổi nên mình cũng chia sẻ tí

Đúng

Không đúng, nếu nói về web/app thì có thể coi là đúng, nó là client trong ứng dụng web/app
còn nói chung chung về mô hình client-server thì là sai. client cũng có thể là một cái máy tính khác, một thiết bị iot nào đó, một “server” nào đó khác, nói chung là có thể là một cái gì đó có khả năng giao tiếp mạng

người dung thao tác trên giao diện (có thể nói là client), thao tác đó được web/app UI chuyển thành request gửi đến server, server phản hồi lại, UI cập nhật kết quả

Bạn đang hiểu sai về server, server chỉ là một process chạy trên hệ điều hành để phục vụ cho những nhu cầu gì đó mà thôi (có thể gọi là service)
Thực tế mình chỉ cần 1 vps vẫn có thể chạy đầy đủ database + 2 web service (thậm chí nhiều hơn) bình thường, vẫn tách bạch các thành phần đó không dính dáng gì tới nhau

5 Likes

server có 3 nghĩa :
Nghĩa 1: Server là một phần cứng (RAM, CPU,…), là thiết bị vật lý (là một cái máy tính cụ thể), là một vật thể (có khối lượng, chiều cao,…). Server để lưu trữ, xử lý tài nguyên, nghĩa là liên quan đến ngành điện tử, viễn thông, thiết bị mạng. Không liên quan đến lập trình lắm. hiểu theo cách này thì sẽ có các loại server như : dedicated server (mua thiết bị về nhà tự làm server), share hosting, VPS là đi thuê server từ người khác, …
Nghĩa 2: Server là một chương trình máy tính, một phần mềm cụ thể, code bằng ngôn ngữ server-side : java, C#, … là các dòng code xử lý tính toán. Nghĩa này dành cho các lập trình viên, coder.
Nghĩa 3: server là một hệ thống, hiểu hơi trừ tượng, server là một cái gì đó, nằm ở đâu đó trên trái đất này mà khi đó nó sẽ cung cấp tài nguyên theo yêu cầu từ client như bạn nói, đây là cách nói chung chung khi người ta thiết kế hệ thống. mô hình client-server hiểu theo nghĩa này. VD : có nhiều loại server : server database, server FTP, web server, DNS server,…

4 Likes

Cho mình hỏi app của mình dùng :

  • Amazon AWS S3, google drive, firebase stogare để lưu media ( ảnh, video, mp3, …)
  • Dùng MS SQL Server của Microsoft azure.
  • Soucre code trong project mình deploy lên hosting của Mắt bão, nhân hòa, bkhost, …

Vậy app của mình có mấy server ?

URI của cậu không theo như recommend cho RESTful. Tớ recommend cậu tham khảo tài liệu này để rõ cách đặt tên.
Trong TH của cậu, cậu có thể đặt tên là

GET https://phongkhamnhakhoa.com/api/patients?page=1

Trong đó:

  • GET: HTTP method. Nó có nghĩa là cậu muốn lấy thông tin.
  • api: webservice của cậu deploy lên endpoint /api
  • patients: collection resource. Nó có nghĩa là cậu muốn truy cập dữ liệu các bệnh nhân.
  • ?page=1: request parameter.

Authentication token nên để ở request header (trong TH cậu sử dụng Basic authentication). Cậu có thể sử dụng cách authenticate khác.

Response trả về mà cậu mô tả là “response body”. Cậu cần mô tả cả response HTTP code. Ngoài ra, trong response body có thể cân nhắc cả status code (success/failure).

Và cậu đúng, sau khi nhận response, web/app sẽ dùng dữ liệu đó để hiển thị.

Nếu cậu muốn design RESTful API, cậu nên phân loại các method thành 6 loại như vậy. Ví dụ: khi cậu xóa thông tin 1 bệnh nhân, cậu có thể gọi tới API:

DELETE https://phongkhamnhakhoa.com/api/patients/{patientId}

Đọc URL trên cậu cũng có thể hiểu luôn ý nghĩa của nó.
Dĩ nhiên cậu cũng có thể chỉ dùng GET và POST, điều này cũng không có vấn đề gì cả.

Để secure 1 API, cậu có rất nhiều cách. Tùy mong muốn của cậu, cậu có thể áp dụng mức độ bảo mật khác nhau. Cách của cậu mô tả có thể tèo nếu người ta đổi số điện thoại, hoặc không cập nhật thông tin đó.
Cậu có thể implement Basic authentication, Bearer token, Oauth2, JWT trong TH của cậu. Nếu đây là đồ án môn học, Basic authentication là đủ. Nếu đây là hệ thống chạy thực tế, ít nhất cậu nên implement Bearer token, hoặc thậm chí là Oauth2.


Trong 2 cách mà cậu đưa ra, tớ thực ra thích cách đầu hơn. Để browser gọi trực tiếp API của cậu đồng nghĩa cậu nên give goodbye kiss với security của hệ thống của cậu, khi authentication strategy và token của cậu bị phơi hết ra phía browser.

8 Likes

Bạn có thể đọc thêm bài sau để hiểu hơn về bảo mật api

Còn về việc tránh bị sử dụng API trái phép
Bạn tham khảo thêm về

Và custom, khi nào request gọi từ địa chỉ website phongkhamnhakhoa.com thì mới được phép vào API và xử lý

7 Likes

Tớ correct chút nhé (minor correction thôi), cậu nên hỏi là “hệ thống (system) của mình có mấy server?”. App mang tính cục bộ hơn.
Hệ thống của cậu dùng:

  • AWS S3, Google drive, firebase: đây là dịch vụ bên thứ 3 (3rd party service), nên nó không cần tính vào hệ thống của cậu.
  • Với MS SQL Server của MS Azure tớ đoán cậu có thể tính số DB server mà cậu cần dùng (trong hóa đơn của cậu chắc sẽ ghi :smile: ).
  • Webapp của cậu được deploy lên các host. Cậu cũng có thể tính được số server mà cậu deploy lên.

Từ đó cậu có thể tính ra số lượng server mà cậu cần rồi.

6 Likes

đúng rồi bạn. ReactJS mình code chỉ dừng lại ở mức, chia class, dùng state, props với mấy cái cơ bản, vì lúc trước mình mới tìm hiểu hiểu react nên code demo, bây giờ cần dùng nên lấy lại ráp backend vào :joy:

về phần server thì app của bạn cần 1 con VPS windows là đủ, SQL server, web server nếu có mail server, FTP, … thì cài chung trên cùng 1 con VPS này và chia cổng ra cho đừng trùng nhau. Bạn không cần phải server 1 thuê 1 nơi, server 2thuê 1 nơi, server chạy database thì thuê nới khác, … chỉ có web lớn mới làm như vậy, chắc cỡ facebook, google, … vì đó là server chuyên dụng, server để chạy database thì chỉ chuyên về database, gửi mail thì build cả server chỉ để xử lý mail, tất cả các server riêng biệt đó (tách biệt về mặt vật lý) hợp lại mới thành một hệ thống. VPS bây giờ tầm 100-200k/tháng là có RAM 1GB, SSD 20GB là đủ yêu cầu của bạn rồi. Deploy app lên VPS còn dễ hơn deploy lên share hosting.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?