python3 Requests实现常见Content-Type请求

本文详细介绍了HTTP头部Content-Type的不同类型及其应用场景,包括application/x-www-form-urlencoded、multipart/form-data、text/xml及application/json等,展示了如何在Python客户端和服务端实现这些类型的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Content-Type 实体头部用于指示资源的MIME类型 media type
在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行MIME查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 X-Content-Type-Options 设置为 nosniff。

application/x-www-form-urlencoded

php服务端代码:

<?php
echo(file_get_contents('php://input') . "\r\n");
var_dump($_POST);
# var_dump($_FILES);
print('REQUEST_METHOD:' . $_SERVER['REQUEST_METHOD'] . "\r\n");
print('CONTENT_TYPE:' . $_SERVER['CONTENT_TYPE']);

python客户端代码:

import requests

res = requests.post(url='http://test/content_type.php',
                    data={'username': 'xiaoming', 'password': '123'},
                    headers={'Content-Type': 'application/x-www-form-urlencoded'}
                    )
# print(res.request.body)
print(res.text)
# print(res.request.headers)

结果:
1

multipart/form-data

multipart/form-data 可用于HTML表单从浏览器发送信息给服务器。作为多部分文档格式,它由边界线(一个由’–'开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,Content-Disposition和 Content-Type 用于文件上传领域,最常用的 (Content-Length 因为边界线作为分隔符而被忽略)。

php服务端:

<?php
echo(file_get_contents('php://input') . "\r\n");
var_dump($_POST);
var_dump($_FILES);
print('REQUEST_METHOD:' . $_SERVER['REQUEST_METHOD'] . "\r\n");
print('CONTENT_TYPE:' . $_SERVER['CONTENT_TYPE']);

python客户端:

import requests

res = requests.post(url='http://test/content_type.php',
                    data={'username': 'xiaoming', 'password': '123'},
                    files={'file':
                           (
                               'test.xlsx',
                               open('test.xlsx', 'rb'),
                               'application/vnd.ms-excel',
                               {'Expires': '0'}
                           )
                    }
                    # headers={'Content-Type': 'multipart/form-data'}
                    )
# print(res.request.body)
print(res.text)
# print(res.request.headers)

结果:
1
print(res.request.body.decode('utf-8', 'ignore'))输出的请求原始数据:
1
还可以使用工具requests_toolbelt.MultipartEncoder

使用requests_toolbelt

import requests
from requests_toolbelt import MultipartEncoder

m = MultipartEncoder({'username': 'xiaoming', 'password': '123',
                      "file": open('test.xlsx', 'rb')})
res = requests.post(url='http://test/content_type.php',
                    data=m,
                    headers={'Content-Type': m.content_type}
                    )
# print(res.request.body.decode('utf-8', 'ignore'))
print(res.text)
# print(res.request.headers)

监控文件上传进度

服务端php代码:

<?
$value1 = $_POST["name"];
$value2 = $_POST["age"];
 
move_uploaded_file($_FILES["file1"]["tmp_name"],
    $_SERVER["DOCUMENT_ROOT"]."/uploadFiles/" . $_FILES["file1"]["name"]);
 
move_uploaded_file($_FILES["file2"]["tmp_name"],
    $_SERVER["DOCUMENT_ROOT"]."/uploadFiles/" . $_FILES["file2"]["name"]);
?>

客户端Python代码:

import requests
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor


def my_callback(monitor):
    progress = (monitor.bytes_read / monitor.len) * 100
    print("\r 文件上传进度:%d%%(%d/%d)" % (progress, monitor.bytes_read, monitor.len), end=" ")


e = MultipartEncoder(
    fields={'username': 'xiaoming', "password": '123',
            'file1': ('1.png', open('logo.png', 'rb'), 'image/png'),
            'file2': ('2.png', open('logo.png', 'rb'), 'image/png')}
)

m = MultipartEncoderMonitor(e, my_callback)

r = requests.post('http://localhost/upload.php', data=m, headers={'Content-Type': m.content_type})
print(r.text)

正文是raw原始信息

text/xml

import requests

res = requests.post(url='http://test/content_type.php', data='<?xml ?>', headers={'Content-Type': 'text/xml'})
print(res.text)

application/json

import requests
import json

res = requests.post(url='http://test/content_type.php',
                    data=json.dumps({'key1': 'value1', 'key2': 'value2'}),
                    headers={'Content-Type': 'application/json'})
print(res.text)

或者:

import requests

res = requests.post(url='http://test/content_type.php',
                    json={'key1': 'value1', 'key2': 'value2'},
                    headers={'Content-Type': 'application/json'})
print(res.text)

参考

https://docs.python-requests.org/zh_CN/latest/
https://www.ietf.org/rfc/rfc1867.txt
https://atlee.ca/software/poster/ 适合python2
https://toolbelt.readthedocs.io/en/latest/
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙在山东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值