2013-11-26 80 views
0

我想要使用drakma获取HTTP请求的重定向URL。如果我通过“http://lisp.org/”,我想要“http://lisp.org/index.html”回来。看着文档,它看起来像我希望标题作为一个alist和drakma:http-request应该给我一个alist。获取HTTP标头为alist

该函数返回SEVEN值 - 回复的主体(如下所示),状态码为整数,服务器发送的头文件的列表,其中每个元素为汽车(名称报头)是一个关键字和CDR(首部的值)是一个字符串....

当我运行drakma:http-request我得到的消息正文,如果我做(setf drakma:*header-stream* *standard-output*)头被示出。当我把这些标题变成可用的形式时,我迷失了方向。

编辑:要获得“http://lisp.org/”重定向URL:

(nth-value 3 (drakma:http-request "http://lisp.org/")) 
Result: #<PURI:URI http://lisp.org/index.html> 

回答

4

功能Common Lisp中返回多个值需要特殊的语法来超越第一接入值;这是一种方便的方法,它允许简单的函数调用一方面简单地返回“最明显的事情”,另一方面也为使用需要它的调用者提供附加信息。

头ALIST,在HTTP-REQUEST的情况下,是返回的第三值,并且因此可以访问:

CL-USER> (nth-value 2 (drakma:http-request "http://lisp.org")) 
((:DATE . "Tue, 26 Nov 2013 16:00:41 GMT") (:CONNECTION . "Close") 
(:SERVER . "AllegroServe/1.2.65") (:CONTENT-TYPE . "text/html") 
(:CONTENT-LENGTH . "459") (:LAST-MODIFIED . "Wed, 26 Oct 2011 02:26:26 GMT")) 

有关NTH-VALUE细节和涉及处理多个值的其他构建体,见section 7.10.1 of Common Lisp, the Language

+0

这是如此奇怪,但令人惊叹。 – deadghost

+0

@deadghost通过与其他语言的比较而感到奇怪,但Lisp中有很多可以公平的说法 - 而且,Lisp也有很多这样的功能,在熟悉它的情况下,您开始希望提供更多的语言。 –