# Python `httplib2` – HTTP GET 和 POST 示例

> 原文： [https://howtodoinjava.com/python/httplib2-http-get-post-requests/](https://howtodoinjava.com/python/httplib2-http-get-post-requests/)

学习使用 Python [`httplib2`](https://github.com/httplib2/httplib2)模块。 超文本传输​​协议（HTTP）是用于分布式协作超媒体信息系统的应用协议。 HTTP 是万维网数据通信的基础。

Python `httplib2`模块提供了用于通过 HTTP 访问 Web 资源的方法。 它支持许多功能，例如 HTTP 和 HTTPS，认证，缓存，重定向和压缩。

```java
$ service nginx status
 * nginx is running

```

我们在本地主机上运行 nginx Web 服务器。 我们的一些示例将连接到本地运行的 nginx 服务器上的 PHP 脚本。

```java
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`库版本

第一个程序打印库的版本，其版权和文档字符串。

```java
#!/usr/bin/python3

import httplib2

print(httplib2.__version__)
print(httplib2.__copyright__)
print(httplib2.__doc__)

```

`httplib2.__version__`给出`httplib2`库的版本，`httplib2.__copyright__`给出其版权，`httplib2.__doc__`给出其文档字符串。

```java
$ ./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](http://www.something.com) 的网站上获取 HTML 内容。

```java
#!/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 请求。 返回值是响应和内容的元组。

```java
$ ./get_content.py 
<html><head><title>Something.</title></head>
<body>Something.</body>
</html>

```

这是示例的输出。

#### 剥离 HTML 标签

以下程序获取一个小型网页，并剥离其 HTML 标签。

```java
#!/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 标记。 请注意，我们正在剥离数据，我们没有对其进行清理。 （这是两件事。）

```java
$ ./strip_tags.py 
Something.
Something.

```

该脚本会打印网页的标题和内容。

#### 检查响应状态

响应对象包含`status`属性，该属性提供响应的状态代码。

```java
#!/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 请求，并检查返回的状态。

```java
$ ./get_status.py 
200
404

```

200 是成功 HTTP 请求的标准响应，而 404 则表明找不到所请求的资源。

## 发送 HTTP HEAD 请求

HTTP HEAD 方法检索文档标题。 标头由字段组成，包括日期，服务器，内容类型或上次修改时间。

```java
#!/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`网页的上次修改时间，内容类型和内容长度。

```java
$ ./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`脚本：

```java
<?php

echo "Hello " . htmlspecialchars($_GET['name']);

?>

```

在`/usr/share/nginx/html/`目录中，有此`greet.php`文件。 该脚本返回`name`变量的值，该值是从客户端检索到的。

`htmlspecialchars()`函数将特殊字符转换为 HTML 实体； 例如`&`至`&amp`。

```java
#!/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 中指定。

```java
$ ./mget.py 
Hello Peter

```

这是示例的输出。

```java
$ 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 表单时经常使用它。

```java
<?php

echo "Hello " . htmlspecialchars($_POST['name']);

?>

```

在本地 Web 服务器上，我们有此`target.php`文件。 它只是将过帐的值打印回客户。

```java
#!/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()`方法进行编码，并在请求的正文中发送。

```java
$ ./mpost.py 
Hello Peter

```

这是`mpost.py`脚本的输出。

```java
$ 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 中发送该值。

## 发送用户代理信息

在本节中，我们指定用户代理的名称。

```java
<?php 

echo $_SERVER['HTTP_USER_AGENT'];

?>

```

在 nginx 文档根目录中，我们有`agent.php`文件。 它返回用户代理的名称。

```java
#!/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 脚本读取，并返回给客户端。

```java
$ ./user_agent.py 
Python script

```

服务器使用我们随请求发送的代理名称进行了响应。

## 将用户名/密码添加到请求

客户端的`add_credentials()`方法设置用于领域的名称和密码。 安全领域是一种用于保护 Web 应用资源的机制。

```java
$ 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 认证的用户名和密码。

```java
location /secure {

        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;
}

```

在 nginx `/etc/nginx/sites-available/default`配置文件中，我们创建一个安全页面。 领域的名称是“禁区”。

```java
<!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 文件。

```java
#!/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())

```

该脚本连接到安全网页； 它提供访问该页面所需的用户名和密码。

```java
$ ./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](http://zetcode.com)，后者专门研究编程教程。