ZetCode

Python GET/POST 请求

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何在 Python 中发送 GET 和 POST 请求。在示例中,我们使用了 requesturllib3socket 模块。我们还将展示如何在 Flask 中处理 GET 或 POST 请求。

HTTP

超文本传输协议 (HTTP) 是一种用于分布式、协作式、超媒体信息系统的应用协议。HTTP 是万维网数据通信的基础。

在示例中,我们使用了 httpbin.org,这是一个免费提供的 HTTP 请求和响应服务,以及 webcode.me,这是一个用于测试的微型 HTML 页面。

HTTP GET

HTTP GET 方法请求指定资源的表示形式。

GET 请求

HTTP POST

HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完成的 Web 表单。

POST 请求

Python urllib3

urllib3 模块是一个强大、易于使用的 Python HTTP 客户端。

$ pip install urllib3

我们使用 pip 安装 urllib3 模块。

Python Requests

Requests 是一个简单优雅的 Python HTTP 库。它提供了通过 HTTP 访问 Web 资源的方法。它在 Apache License 2.0 下发布。它是最受欢迎的 Python 包之一。

$ pip install requests

我们安装 request 模块。

Python Flask

Flask 是最受欢迎的 Python 微型 Web 框架。大部分功能都可以作为扩展使用,包括验证、表单处理、对象关系映射器或身份验证。Flask 基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎。

$ pip install Flask

我们安装 Flask。

使用 urllib3 发送 Python GET 请求

GET 请求是通过 request 方法创建的,该方法将 'GET' 值作为其第一个参数。

get_req.py
#!/usr/bin/python

import urllib3

http = urllib3.PoolManager()

url = 'http://webcode.me'

resp = http.request('GET', url)
print(resp.data.decode('utf-8'))

GET 请求被发送到 webcode.me。

$ ./get_req.py 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>
    
    <p>
         Hello there. How are you?
    </p>
    
</body>
</html>

使用 urllib3 发送 Python POST 请求

POST 请求是通过 request 方法创建的,该方法将 'POST' 值作为其第一个参数。

post_req.py
#!/usr/bin/python

import urllib3
import certifi

http = urllib3.PoolManager(ca_certs=certifi.where())

url = 'https://httpbin.org/post'

req = http.request('POST', url, fields={'name': 'John Doe', 
    'occupation': 'gardener'})
print(req.data.decode('utf-8'))

POST 请求被发送到 httpbin.org/post。

$ ./post_req.py 
{
    "args": {}, 
    "data": "", 
    "files": {}, 
    "form": {
    "name": "John Doe", 
    "occupation": "gardener"
    }, 
    "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "230", 
    "Content-Type": "multipart/form-data; boundary=510415c9b680823ee5512359fa1b3d22", 
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-5f159c14-fc386023685d681205723862"
    }, 
    ...
    "url": "https://httpbin.org/post"
}

使用 requests 发送 Python GET 请求

GET 请求是通过 get 方法生成的。

get_req2.py
#!/usr/bin/python

import requests as req

resp = req.get("http://webcode.me")

print(resp.text)

GET 请求被发送到 webcode.me。

使用 requests 发送 Python POST 请求

POST 请求是通过 post 方法生成的。

post_req2.py
#!/usr/bin/python

import requests as req

data = {'name': 'Peter'}

resp = req.post("https://httpbin.org/post", data)
print(resp.text)

POST 请求被发送到 httpbin.org/post。

在 Flask 中处理 Python GET 请求

以下示例展示了如何在 Flask 应用程序中处理 GET 请求。

app.py
#!/usr/bin/python

from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def index():

    return 'Home page'


@app.route('/greet', methods=['GET'])
def greet():

    name = request.args.get('name', 'Guest')
    msg = f'Hello {name}'

    return msg, 200, {'Content-Type': 'text/plain; charset=utf-8'}

该应用程序会创建一条消息并将其发送给客户端。它使用 name 查询参数的值。

@app.route('/greet', methods=['GET'])
def greet():
...

greet 函数被映射到 /greet 路径和 GET 类型请求。

$ export FLASK_APP=app.py
$ flask run

我们运行应用程序。

$ curl -i localhost:5000/greet?name=Lucia
HTTP/1.0 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Server: Werkzeug/1.0.0 Python/3.8.3
Date: Mon, 20 Jul 2020 13:37:38 GMT

Hello Lucia

我们使用 curl 工具向应用程序创建 GET 请求。使用 -i 选项,我们还包含响应头。

在 Flask 中处理 Python POST 请求

以下示例展示了如何在 Flask 中处理 POST 请求。

app.py
#!/usr/bin/python

from flask import Flask, make_response

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Home page'


@app.route('/users/<name>', methods=['POST'])
def create_user(name):

    msg = f'user {name} created'
    return make_response(msg, 201)

要处理 POST 请求,我们在 methods 参数中指定方法名称。

$ export FLASK_APP=app.py
$ flask run

我们运行应用程序。

$ curl -X POST localhost:5000/users/Peter/
user Peter created

创建了一个 POST 请求。

来源

Python urllib3 用户指南

在本文中,我们演示了如何在 Python 中生成基本的 GET 和 POST 请求。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程