原文: https://howtodoinjava.com/python/httplib2-http-get-post-requests/
学习使用 Python httplib2模块。 超文本传输协议(HTTP)是用于分布式协作超媒体信息系统的应用协议。 HTTP 是万维网数据通信的基础。
Python httplib2模块提供了用于通过 HTTP 访问 Web 资源的方法。 它支持许多功能,例如 HTTP 和 HTTPS,认证,缓存,重定向和压缩。
$ service nginx status* nginx is running
我们在本地主机上运行 nginx Web 服务器。 我们的一些示例将连接到本地运行的 nginx 服务器上的 PHP 脚本。
Table of ContentsCheck httplib2 Library VersionUse httplib2 to Read Web PageSend HTTP HEAD RequestSend HTTP GET RequestSend HTTP POST RequestSend User Agent InformationAdd Username/Password to Request
检查httplib2库版本
第一个程序打印库的版本,其版权和文档字符串。
#!/usr/bin/python3import httplib2print(httplib2.__version__)print(httplib2.__copyright__)print(httplib2.__doc__)
httplib2.__version__给出httplib2库的版本,httplib2.__copyright__给出其版权,httplib2.__doc__给出其文档字符串。
$ ./version.py0.8Copyright 2006, Joe Gregoriohttplib2A caching http interface that supports ETags and gzipto conserve bandwidth.Requires Python3.0 or laterChangelog:2009-05-28, Pilgrim: ported to Python32007-08-18, Rick: Modified so it's able to use a socks proxy if needed.
这是示例的示例输出。
使用httplib2读取网页
在下面的示例中,我们显示了如何从名为 www.something.com 的网站上获取 HTML 内容。
#!/usr/bin/python3import httplib2http = httplib2.Http()content = http.request("http://www.something.com")[1]print(content.decode())
使用httplib2.HTTP()创建一个 HTTP 客户端。 使用request()方法创建一个新的 HTTP 请求; 默认情况下,它是一个 GET 请求。 返回值是响应和内容的元组。
$ ./get_content.py<html><head><title>Something.</title></head><body>Something.</body></html>
这是示例的输出。
剥离 HTML 标签
以下程序获取一个小型网页,并剥离其 HTML 标签。
#!/usr/bin/python3import httplib2import rehttp = httplib2.Http()content = http.request("http://www.something.com")[1]stripped = re.sub('<[^<]+?>', '', content.decode())print(stripped)
一个简单的正则表达式用于剥离 HTML 标记。 请注意,我们正在剥离数据,我们没有对其进行清理。 (这是两件事。)
$ ./strip_tags.pySomething.Something.
该脚本会打印网页的标题和内容。
检查响应状态
响应对象包含status属性,该属性提供响应的状态代码。
#!/usr/bin/python3import httplib2http = httplib2.Http()resp = http.request("http://www.something.com")[0]print(resp.status)resp = http.request("http://www.something.com/news/")[0]print(resp.status)
我们使用request()方法执行两个 HTTP 请求,并检查返回的状态。
$ ./get_status.py200404
200 是成功 HTTP 请求的标准响应,而 404 则表明找不到所请求的资源。
发送 HTTP HEAD 请求
HTTP HEAD 方法检索文档标题。 标头由字段组成,包括日期,服务器,内容类型或上次修改时间。
#!/usr/bin/python3import httplib2http = httplib2.Http()resp = http.request("http://www.something.com", "HEAD")[0]print("Server: " + resp['server'])print("Last modified: " + resp['last-modified'])print("Content type: " + resp['content-type'])print("Content length: " + resp['content-length'])
该示例打印服务器,www.something.com网页的上次修改时间,内容类型和内容长度。
$ ./do_head.pyServer: Apache/2.4.12 (FreeBSD) OpenSSL/1.0.1l-freebsd mod_fastcgi/mod_fastcgi-SNAP-0910052141Last modified: Mon, 25 Oct 1999 15:36:02 GMTContent type: text/htmlContent length: 72
这是程序的输出。 从输出中,我们可以看到该网页是由 FreeBSD 托管的 Apache Web 服务器交付的。 该文档的最后修改时间是 1999 年。网页是 HTML 文档,其长度为 72 个字节。
发送 HTTP GET 请求
HTTP GET 方法请求指定资源的表示形式。 对于此示例,我们还将使用greet.php脚本:
<?phpecho "Hello " . htmlspecialchars($_GET['name']);?>
在/usr/share/nginx/html/目录中,有此greet.php文件。 该脚本返回name变量的值,该值是从客户端检索到的。
htmlspecialchars()函数将特殊字符转换为 HTML 实体; 例如&至&。
#!/usr/bin/python3import httplib2http = httplib2.Http()content = http.request("http://localhost/greet.php?name=Peter",method="GET")[1]print(content.decode())
该脚本将带有值的变量发送到服务器上的 PHP 脚本。 该变量直接在 URL 中指定。
$ ./mget.pyHello Peter
这是示例的输出。
$ tail -1 /var/log/nginx/access.log127.0.0.1 - - [21/Aug/2016:17:32:31 +0200] "GET /greet.php?name=Peter HTTP/1.1" 200 42 "-""Python-httplib2/0.8 (gzip)"
我们检查了 nginx 访问日志。
发送 HTTP POST 请求
POST 请求方法请求 Web 服务器接受并存储请求消息正文中包含的数据。 上载文件或提交完整的 Web 表单时经常使用它。
<?phpecho "Hello " . htmlspecialchars($_POST['name']);?>
在本地 Web 服务器上,我们有此target.php文件。 它只是将过帐的值打印回客户。
#!/usr/bin/python3import httplib2import urllibhttp = httplib2.Http()body = {'name': 'Peter'}content = http.request("http://localhost/target.php",method="POST",headers={'Content-type': 'application/x-www-form-urlencoded'},body=urllib.parse.urlencode(body) )[1]print(content.decode())
脚本使用具有Peter值的name键发送请求。 数据使用urllib.parse.urlencode()方法进行编码,并在请求的正文中发送。
$ ./mpost.pyHello Peter
这是mpost.py脚本的输出。
$ tail -1 /var/log/nginx/access.log127.0.0.1 - - [23/Aug/2016:12:21:07 +0200] "POST /target.php HTTP/1.1"200 37 "-" "Python-httplib2/0.8 (gzip)"
使用 POST 方法时,不会在请求 URL 中发送该值。
发送用户代理信息
在本节中,我们指定用户代理的名称。
<?phpecho $_SERVER['HTTP_USER_AGENT'];?>
在 nginx 文档根目录中,我们有agent.php文件。 它返回用户代理的名称。
#!/usr/bin/python3import httplib2http = httplib2.Http()content = http.request("http://localhost/agent.php", method="GET",headers={'user-agent': 'Python script'})[1]print(content.decode())
该脚本为agent.php脚本创建一个简单的 GET 请求。 在headers词典中,我们指定用户代理。 这可以通过 PHP 脚本读取,并返回给客户端。
$ ./user_agent.pyPython script
服务器使用我们随请求发送的代理名称进行了响应。
将用户名/密码添加到请求
客户端的add_credentials()方法设置用于领域的名称和密码。 安全领域是一种用于保护 Web 应用资源的机制。
$ sudo apt-get install apache2-utils$ sudo htpasswd -c /etc/nginx/.htpasswd user7New password:Re-type new password:Adding password for user user7
我们使用htpasswd工具创建用于基本 HTTP 认证的用户名和密码。
location /secure {auth_basic "Restricted Area";auth_basic_user_file /etc/nginx/.htpasswd;}
在 nginx /etc/nginx/sites-available/default配置文件中,我们创建一个安全页面。 领域的名称是“禁区”。
<!DOCTYPE html><html lang="en"><head><title>Secure page</title></head><body><p>This is a secure page.</p></body></html>
在/usr/share/nginx/html/secure目录中,我们具有上面的 HTML 文件。
#!/usr/bin/python3import httplib2user = 'user7'passwd = '7user'http = httplib2.Http()http.add_credentials(user, passwd)content = http.request("http://localhost/secure/")[1]print(content.decode())
该脚本连接到安全网页; 它提供访问该页面所需的用户名和密码。
$ ./credentials.py<!DOCTYPE html><html lang="en"><head><title>Secure page</title></head><body><p>This is a secure page.</p></body></html>
使用正确的凭据,脚本将返回受保护的页面。
在本教程中,我们探索了 Python httplib2模块。
该教程由 Jan Bodnar 编写,他经营着 zetcode.com,后者专门研究编程教程。
