原文: 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 Contents
Check httplib2 Library Version
Use httplib2 to Read Web Page
Send HTTP HEAD Request
Send HTTP GET Request
Send HTTP POST Request
Send User Agent Information
Add Username/Password to Request
检查httplib2
库版本
第一个程序打印库的版本,其版权和文档字符串。
#!/usr/bin/python3
import httplib2
print(httplib2.__version__)
print(httplib2.__copyright__)
print(httplib2.__doc__)
httplib2.__version__
给出httplib2
库的版本,httplib2.__copyright__
给出其版权,httplib2.__doc__
给出其文档字符串。
$ ./version.py
0.8
Copyright 2006, Joe Gregorio
httplib2
A caching http interface that supports ETags and gzip
to conserve bandwidth.
Requires Python3.0 or later
Changelog:
2009-05-28, Pilgrim: ported to Python3
2007-08-18, Rick: Modified so it's able to use a socks proxy if needed.
这是示例的示例输出。
使用httplib2
读取网页
在下面的示例中,我们显示了如何从名为 www.something.com 的网站上获取 HTML 内容。
#!/usr/bin/python3
import httplib2
http = 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/python3
import httplib2
import re
http = httplib2.Http()
content = http.request("http://www.something.com")[1]
stripped = re.sub('<[^<]+?>', '', content.decode())
print(stripped)
一个简单的正则表达式用于剥离 HTML 标记。 请注意,我们正在剥离数据,我们没有对其进行清理。 (这是两件事。)
$ ./strip_tags.py
Something.
Something.
该脚本会打印网页的标题和内容。
检查响应状态
响应对象包含status
属性,该属性提供响应的状态代码。
#!/usr/bin/python3
import httplib2
http = 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.py
200
404
200 是成功 HTTP 请求的标准响应,而 404 则表明找不到所请求的资源。
发送 HTTP HEAD 请求
HTTP HEAD 方法检索文档标题。 标头由字段组成,包括日期,服务器,内容类型或上次修改时间。
#!/usr/bin/python3
import httplib2
http = 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.py
Server: Apache/2.4.12 (FreeBSD) OpenSSL/1.0.1l-freebsd mod_fastcgi/mod_fastcgi-SNAP-0910052141
Last modified: Mon, 25 Oct 1999 15:36:02 GMT
Content type: text/html
Content length: 72
这是程序的输出。 从输出中,我们可以看到该网页是由 FreeBSD 托管的 Apache Web 服务器交付的。 该文档的最后修改时间是 1999 年。网页是 HTML 文档,其长度为 72 个字节。
发送 HTTP GET 请求
HTTP GET 方法请求指定资源的表示形式。 对于此示例,我们还将使用greet.php
脚本:
<?php
echo "Hello " . htmlspecialchars($_GET['name']);
?>
在/usr/share/nginx/html/
目录中,有此greet.php
文件。 该脚本返回name
变量的值,该值是从客户端检索到的。
htmlspecialchars()
函数将特殊字符转换为 HTML 实体; 例如&
至&
。
#!/usr/bin/python3
import httplib2
http = httplib2.Http()
content = http.request("http://localhost/greet.php?name=Peter",
method="GET")[1]
print(content.decode())
该脚本将带有值的变量发送到服务器上的 PHP 脚本。 该变量直接在 URL 中指定。
$ ./mget.py
Hello Peter
这是示例的输出。
$ tail -1 /var/log/nginx/access.log
127.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 表单时经常使用它。
<?php
echo "Hello " . htmlspecialchars($_POST['name']);
?>
在本地 Web 服务器上,我们有此target.php
文件。 它只是将过帐的值打印回客户。
#!/usr/bin/python3
import httplib2
import urllib
http = 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.py
Hello Peter
这是mpost.py
脚本的输出。
$ tail -1 /var/log/nginx/access.log
127.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 中发送该值。
发送用户代理信息
在本节中,我们指定用户代理的名称。
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
在 nginx 文档根目录中,我们有agent.php
文件。 它返回用户代理的名称。
#!/usr/bin/python3
import httplib2
http = 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.py
Python script
服务器使用我们随请求发送的代理名称进行了响应。
将用户名/密码添加到请求
客户端的add_credentials()
方法设置用于领域的名称和密码。 安全领域是一种用于保护 Web 应用资源的机制。
$ sudo apt-get install apache2-utils
$ sudo htpasswd -c /etc/nginx/.htpasswd user7
New 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/python3
import httplib2
user = '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,后者专门研究编程教程。