Racket 编程

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。