我正在使用SBCL、Emacs和Slime.此外,我正在使用德克萨多图书馆.
CL-USER> (dex:get "http://ip.jsontest.com/")
"{\"ip\": \"179.878.248.207\"}
其他人将返回HTML:
(dex:get "https://ambrevar.xyz/")
"<!DOCTYPE html>
<html lang=\"en\">
<head>
<!-- 2021-12-29 -->
<meta charset=\"utf-8\">
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
<title>‎</title>
<meta name=\"generator\" content=\"Org mode\">
<meta name=\"author\" content=\"root\">
<link rel=\"stylesheet\" type=\"text/css\" href=\"../dark.css\">
<link rel=\"icon\" type=\"image/x-icon\" href=\"../logo.png\">
</head>
<body>
<div id=\"content\">
<div id=\"outline-container-org4051da4\" class=\"outline-2\">
<h2 id=\"org4051da4\">Contact</h2>
<div class=\"outline-text-2\" id=\"text-org4051da4\">
<ul class=\"org-ul\">
<li>Email: <a href=\"mailto:mail@ambrevar.xyz\">mail@ambrevar.xyz</a></li>
<li>PGP: <a href=\"ambrevar.asc\">0x9BDCF497A4BBCC7F</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>
"
将结果存储在变量中后,使用:
CL-USER> (defparameter html-response (dex:get "https://ambrevar.xyz/"))
HTML-RESPONSE
CL-USER> (defparameter json-response (dex:get "http://ip.jsontest.com/"))
JSON-RESPONSE
我想创建一个函数来判断输出是JSON还是HTML.因此,我做了这个功能:
(defun html-or-json (response)
"Check it the server response is HTML or JSON data."
(cond ((null response) nil)
((equal (subseq response 0 1) "<") "html")
(t "json")))
它的工作原理是:
CL-USER> (html-or-json json-response)
"json"
CL-USER> (html-or-json html-response)
"html"
然而,我的解决方案在我看来是丑陋的.最初,我try 使用handle-case
并将答案序列化为JSON.如果成功,它将是一个JSON.如果失败,函数会将对象视为HTML.但事情进展不顺利,因为我不精通handle-case
种语法.
你能想出一个替代方案来实现这个目标吗?也许用handle-case
?