美文网首页
使用tornado的httpclient模拟客户端

使用tornado的httpclient模拟客户端

作者: 先赚1个亿 | 来源:发表于2016-10-28 02:26 被阅读0次

    可以用下面的代码来访问bilibili

    importtornado.httpclienthttp_client = tornado.httpclient.HTTPClient()try:    response = http_client.fetch("http://www.bilibili.com/")printresponse.bodyexcepthttpclient.HTTPErrorase:print"Error:", ehttp_client.close()

    看下输出

    哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ  乾杯~  - bilibili.......

    恩是B站首页没错

    我们来解析一下上面的代码

    首先是http_client = tornado.httpclient.HTTPClient()

    创建了一个HTTPClient实例

    这个类有两个函数

    def fetch(self, request,**kwargs)

    其中的request可以是一个HTTPRequest 的实例或者是一个url的字符串

    返回的是HTTPResponse对象

    HTTPRequest和HTTPResponse

    这两个类定义在httpclient.py 中 可以从源码中看下是如何实现的

    看下HTTPRequest的init(self)函数:

    def __init__(self, url, method="GET", headers=None, body=None,                auth_username=None, auth_password=None, auth_mode=None,                connect_timeout=None, request_timeout=None,                if_modified_since=None, follow_redirects=None,                max_redirects=None, user_agent=None, use_gzip=None,                network_interface=None, streaming_callback=None,                header_callback=None, prepare_curl_callback=None,                proxy_host=None, proxy_port=None, proxy_username=None,                proxy_password=None, allow_nonstandard_methods=None,                validate_cert=None, ca_certs=None,                allow_ipv6=None,                client_key=None, client_cert=None, body_producer=None,                expect_100_continue=False, decompress_response=None):

    我们来看下关键的参数

    url  链接参数

    method  如POST GET 默认为GET

    headers 请求的额外头  可以是HTTPHeader ,也可以是个dict

    其他参数

    HTTPResponse定义了许多字段

    request: 是一个HTTPRequest 的实例

    code: http状态码  e.g. 200 or 404

    reason: OK ERROR 什么的  原因解释

    headers:响应头 是一个 tornado.httputil.HTTPHeaders 实例

    effective_url: 经过重定向之后的网址

    body: response body as string (created on demand from self.buffer)

    error: 如果出错 则存在Exception 的实例,

    request_time: 整个过程所消耗的时间 秒为单位

    异步客户端

    class tornado.httpclient.AsyncHTTPClient

    下面这段代码和开头代码的效果是一样的

    defhandle_request(response):ifresponse.error:print"Error:", response.errorelse:printresponse.bodyhttp_client = tornado.httpclient.AsyncHTTPClient()http_client.fetch("http://www.bilibili.com/", handle_request)tornado.ioloop.IOLoop.instance().start()

    题目之间的区别在于,前者要等待 完成整个请求,期间cpu是不干任何事的

    而后者发出请求后将继续做其他事情,请求完成后会产生时间来执行handle_request这个函数

    既所谓回调函数 ,和cpu的interrupt机制一样,提高效率的方法

    文/金发萌音(简书作者)

    原文链接:http://www.jianshu.com/p/75b466b81c5b

    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    相关文章

      网友评论

          本文标题:使用tornado的httpclient模拟客户端

          本文链接:https://www.haomeiwen.com/subject/wmwsuttx.html