【问题标题】:Using tornado.httpclient.AsyncHTTPClient.fetch() to make a GET request along with parameters使用 tornado.httpclient.AsyncHTTPClient.fetch() 与参数一起发出 GET 请求
【发布时间】:2013-06-25 08:49:24
【问题描述】:

如标题所述,我想使用 AsyncHTTPclient 的 fetch() 方法进行异步 GET 请求。

但是,我不知道在哪里提供查询参数。

所以,假设我要提出请求

http://xyz.com?a=1&b=2

我在哪里提供ab?执行此操作的唯一方法是将参数附加到 URL。具体来说,有没有办法传递一个 Dict,然后 Tornado 框架将其附加到 URL 中。

【问题讨论】:

    标签: asynchronous get tornado


    【解决方案1】:
    from tornado.httputil import url_concat
    params = {"a": 1, "b": 2}
    url = url_concat("http://example.com/", params)
    
    http_client = AsyncHTTPClient()
    http_client.fetch(url, request_callback_handler)
    

    【讨论】:

    • @Karthik:我发现龙卷风有它自己的功能,更新答案。
    【解决方案2】:

    您也可以使用 tornado HTTPRequest 来制作请求对象,然后您可以使用带有请求对象的 httpclient 作为获取参数。

    Link for tornado HTTPRequest doc

    HTTPRequest 的代码示例

    import tornado.httpclient
    import urllib
    
    url = 'http://example.com/'
    body = urllib.urlencode({'a': 1, 'b': 2})
    req = tornado.httpclient.HTTPRequest(url, 'GET', body=body)
    
    # I have used synchronous one (you can use async one with callback)
    client = tornado.httpclient.HTTPClient()
    
    res = client.fetch(req)
    

    【讨论】:

    • 我认为body关键字不能与GET方法一起使用,在tornado(4.1)中试试。
    • 在 python3 中,urlencode 已移至 urllib.parse。例如尝试:urllib.parse.urlencode({'a':123})
    【解决方案3】:

    您可以简单地将它们包含在 URL 中:

    def handle_request(response):
        if response.error:
            print "Error:", response.error
        else:
            print response.body
    
    http_client = AsyncHTTPClient()
    http_client.fetch("http://www.google.com/?q=tornado", handle_request)
    

    通过documentation 引用然后tornado.httpclient.HTTPRequest 对象不提供任何接口来提供参数化变量集以构建可附加到 URL 的查询字符串。

    【讨论】:

    • 是的,没错。但是大多数框架都提供了一种传递字典的方法,然后将字典附加到 URL 上。只是想知道 Tornado 是否有这样的设施
    猜你喜欢
    • 2020-11-23
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多