如何在Common Lisp中不依赖yason/cl-json向Kubernetes Web API发POST请求
在Common Lisp中不使用JSON库发送POST请求到指定API
需求说明
需要向地址 http://qr-restservices-test1.xxx/v1/qual 发送携带指定JSON数据的POST请求,且不能使用yason或cl-json等JSON处理库。
实现方案
我们可以使用Common Lisp常用的HTTP客户端库drakma来发送请求,同时手动构造符合要求的JSON字符串(因为禁止使用JSON序列化库)。
1. 加载drakma库
首先确保通过Quicklisp加载drakma:
(ql:quickload :drakma)
2. 静态JSON请求实现
如果参数不需要动态变化,直接写死JSON字符串即可:
(defun send-static-qual-request () (let* ((target-url "http://qr-restservices-test1.xxx/v1/qual") ;; 手动构造JSON字符串,注意Lisp中双引号需用反斜杠转义 (json-content "{ \"requestId\":\"12345\", \"houseNumber\":\"5555\", \"streetName\":\"Erling garden\", \"city\":\"PHOENIX\", \"state\":\"AZ\", \"unit\":\"\", \"floor\":\"\", \"building\":\"\", \"postalCode\":\"0000\", \"qualProcessType\":\"GGG\", \"network\": \"JINX\", \"SrcSystem\": \"BLUE\" }") (response (drakma:http-request target-url :method :post :content json-content :content-type "application/json"))) ;; 打印响应结果 (format t "请求响应内容: ~a~%" response)))
3. 动态参数请求实现
如果需要根据变量生成JSON,可以用format函数拼接字符串,避免手动修改的繁琐:
;; 生成符合格式的JSON字符串 (defun generate-qual-json (request-id house-num street city state zip qual-type network src-system) (format nil "{ \"requestId\":\"~a\", \"houseNumber\":\"~a\", \"streetName\":\"~a\", \"city\":\"~a\", \"state\":\"~a\", \"unit\":\"\", \"floor\":\"\", \"building\":\"\", \"postalCode\":\"~a\", \"qualProcessType\":\"~a\", \"network\": \"~a\", \"SrcSystem\": \"~a\" }" request-id house-num street city state zip qual-type network src-system)) ;; 发送带动态参数的POST请求 (defun send-dynamic-qual-request (request-id house-num street city state zip qual-type network src-system) (let* ((target-url "http://qr-restservices-test1.xxx/v1/qual") (json-content (generate-qual-json request-id house-num street city state zip qual-type network src-system)) (response (drakma:http-request target-url :method :post :content json-content :content-type "application/json"))) (format t "请求响应内容: ~a~%" response)))
关键注意点
- 手动构造JSON时必须保证格式正确:引号配对、逗号分隔、特殊字符(如双引号、反斜杠)需用
\转义。 - 必须设置
Content-Type为application/json,否则服务器无法正确解析请求体。 - 确保运行环境已安装Quicklisp,以便加载drakma库。
内容的提问来源于stack exchange,提问作者raymond indwar
相关产品推荐
相关产品推荐

