使用 url.el 发送请求的时候,碰到一个奇怪的问题。百思不得其解,所以来请教各位。
这是一段使用 url.el 处理文件上传的示例代码。因为是文件内容,所以请求方法为 POST。
在 url.el 中,是通过 url-request-method
的方式指定请求方法:
(defun gt-multipart-data (file)
"拼接 multipart 格式请求体"
(with-temp-buffer
(set-buffer-multibyte nil)
(insert-file-contents-literally file)
(concat "--my-boundary-111\r\n"
"Content-Disposition: form-data; name=\"file\"\r\n\r\n"
(buffer-substring-no-properties (point-min) (point-max)) "\r\n"
"--my-boundary-111--")))
;; 发送 post 请求,请求体为 aaa.jpg 文件内容
(let ((url-request-data (gt-multipart-data "~/aaa.jpg"))
(url-request-extra-headers '(("Content-type" . "multipart/form-data; boundary=my-boundary-111")))
(url-request-method "POST") ; <-- 1
;;(url-request-method (upcase (format "%s" 'post))) ; <-- 2
)
(url-retrieve "https://httpbin.org/post" (lambda (_) (message "ok"))))
上面代码是可以正常运行的。但奇怪的是,如果将 1 处的代码改为 2,代码却运行不了。报错:
error in process sentinel: Multibyte text in HTTP request: POST /post HTTP/1.1
是我眼花写错了什么吗?还是有别的什么原因?
请大佬指点。
运行环境是 macOS, emacs30。