【问题标题】:Issue an HTTP GET from REPL in Racket在 Racket 中从 REPL 发出 HTTP GET
【发布时间】:2013-05-17 21:36:19
【问题描述】:

我觉得我遗漏了一些东西,但是在仔细阅读 net/url 的文档并大致浏览之后,我无法找到一种从交互式提示发出 GET 请求的方法。基本上,我想模仿我的 python 工作流程来浏览网站:

response = urlopen("http://www.someurl.com")

这在 Racket 中可行吗?

【问题讨论】:

    标签: http scheme racket read-eval-print-loop


    【解决方案1】:

    使用call/input-url 有几个优点:

    • 您不需要自己关闭端口。
    • 即使出现异常,端口也会关闭。
    • 它的第三个参数是(input-port? -> any/c)——也就是说,一个接受input-port并返回任何东西的函数。除了您自己编写的函数之外,这可能是一个已经定义的函数,例如 port->stringread-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 实现它会更好。

    【讨论】:

    • 除了“手动”解析标题之外,还有什么方法可以提取状态码?我很惊讶我找不到任何帮助函数来做到这一点,无论是在球拍本身还是在你的 http 库中。
    • 对不起,直到现在我才注意到你的评论!我的 http lib 具有执行此操作的功能:github.com/greghendershott/http/blob/master/http/…
    【解决方案2】:

    试试这个:

    (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))
    

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2014-08-15
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多