Lisp发送JSON请求至远程服务器遇400错误求协助
问题排查与解决方案
问题根源
你收到400 Bad Request的核心原因有两个:
- 服务器明确要求JSON格式的请求体,但你使用的
format-msg函数生成的是XML数据,格式完全不匹配 - 发送请求时可能未设置
Content-Type: application/json请求头,服务器无法正确解析请求内容
正确实现步骤(Common Lisp)
我们使用drakma(HTTP客户端库)和cl-json(JSON序列化库)来实现正确的JSON请求发送,这两个是Common Lisp生态中常用的成熟工具。
1. 安装依赖库
如果使用Quicklisp包管理器,直接在REPL中执行:
(ql:quickload '(drakma cl-json))
2. 构造请求数据结构
把目标JSON转换成Lisp的关联列表(alist),示例如下:
(defparameter *request-data* '(("requestId" . "12345") ("houseNumber" . "5555") ("streetName" . "Erling garden") ("city" . "PHOENIX") ("state" . "AZ") ("unit" . "") ("floor" . "") ("building" . "") ("postalCode" . "0000") ("qualProcessType" . "GGG") ("network" . "JINX") ("SrcSystem" . "BLUE")))
3. 序列化为JSON字符串
用cl-json:encode-json-to-string把Lisp数据转换成标准JSON格式:
(defparameter *json-body* (cl-json:encode-json-to-string *request-data*))
4. 发送HTTP POST请求
使用drakma:http-request发送请求,指定正确的URL、请求方法、请求体和请求头:
(let ((response (drakma:http-request "你的远程服务器接口URL" :method :post :content *json-body* :content-type "application/json"))) (format t "服务器响应: ~a~%" response))
关键注意点
- 替换代码中的
"你的远程服务器接口URL"为实际的接口地址 - 可以通过打印
*json-body*检查序列化后的字符串是否和目标JSON格式完全一致 - 如果服务器需要额外请求头(比如认证信息),可通过
:additional-headers参数添加,示例::additional-headers '(("Authorization" . "Bearer your-auth-token"))
内容的提问来源于stack exchange,提问作者Raymond Indwar
相关产品推荐
相关产品推荐

