第 3 部分 · 应用开发实战
RESTful API
RESTful API
设计和实现符合 REST 规范的 JSON API,处理认证与错误。
JSON API 框架
#lang racket (require web-server/servlet web-server/servlet-env web-server/dispatch json) (define (response/json data [status 200]) (response/full status #"OK" (current-seconds) APPLICATION/JSON-MIME-TYPE '() (list (jsexpr->bytes data)))) ;; GET /api/users (define (list-users req) (response/json #hasheq((data . (#hasheq((id . 1) (name . "Alice")) #hasheq((id . 2) (name . "Bob"))))))) ;; GET /api/users/:id (define (get-user req id) (response/json #hasheq((data . #hasheq((id . ,id) (name . "Alice")))))) ;; POST /api/users (define (create-user req) (define body (read-json (request-port req))) (response/json #hasheq((data . #hasheq((id . 3) (name . ,(hash-ref body 'name))))) 201)) (define-values (dispatch url) (dispatch-rules [("api" "users") #:method "get" list-users] [("api" "users") #:method "post" create-user] [("api" "users" (integer-arg)) get-user]))
错误处理
(define (response/error status message) (response/json #hasheq((error . #hasheq((status . ,status) (message . ,message)))) status))
认证中间件
(define (with-auth handler) (lambda (req) (define auth (headers-assq #"Authorization" (request-headers/raw req))) (if (and auth (valid-token? (substring (header-value auth) 7))) (handler req) (response/error 401 "Unauthorized"))))
小结
Racket 构建RESTful API 简洁高效。结合 JSON 库和路由分发,可以快速搭建生产级 API。