我觉得我错过了一些东西,但是在仔细阅读了net / url的文档并且总体上进行了探讨之后,我无法找到从交互式提示中发出GET请求的方法。基本上,我想模仿我的python工作流来浏览一个网站:
response = urlopen("http://www.someurl.com")
这在Racket中是否可行?
答案 0 :(得分:12)
使用call/input-url
有一些优势:
(input-port? -> any/c)
- 即一个带input-port
并返回任何内容的函数。除了您自己编写的函数之外,这可能是一个已定义的函数,如port->string
,read-html-as-xml
等。例如:
(call/input-url (string->url "http://www.google.com/")
get-pure-port
port->string)
注意:当我输入这个答案时,我注意到Óscar编辑了他的重定向。我的类似编辑将是:
(call/input-url (string->url "http://www.google.com/")
(curry get-pure-port #:redirections 4)
port->string)
当然,在REPL频繁输入任何一种方式仍然相当冗长。因此Óscar建议定义自己的url-open
函数是一个很好的建议。我认为,使用call/input-url
实现它会更好。
答案 1 :(得分:7)
试试这个:
(require net/url)
(define input (get-pure-port (string->url "http://www.someurl.com")))
(define response (port->string input))
(close-input-port input)
现在response
变量将包含来自服务器的http响应。更好的是,在程序中包含上述内容,还要注意我添加了允许的最大重定向次数:
(define (urlopen url)
(let* ((input (get-pure-port (string->url url) #:redirections 5))
(response (port->string input)))
(close-input-port input)
response))
(urlopen "http://www.someurl.com") ; this will return the response
修改强>
按照@ GregHendershott的优秀建议(详见他的答案),这是实现所需功能的另一种更强大的方法:
(define (urlopen url)
(call/input-url
(string->url url)
(curry get-pure-port #:redirections 5)
port->string))