用python发送GET和POST请求

博客介绍了Python不同版本下的GET和POST请求实现,涵盖Python 2.7和3.5版本。此外,还提及了Python 3.5中cookie的使用方法,为Python网络请求开发提供了参考。

GET请求:

python2.7:

import urllib,urllib2
url='http://192.168.199.1:8000/mainsugar/loginGET/'
textmod ={'user':'admin','password':'admin'}
textmod = urllib.urlencode(textmod)
print(textmod)
#输出内容:password=admin&user=admin
req = urllib2.Request(url = '%s%s%s' % (url,'?',textmod))
res = urllib2.urlopen(req)
res = res.read()
print(res)
#输出内容:登录成功

 

python3.5:

 

from urllib import parse,request
textmod={'user':'admin','password':'admin'}
textmod = parse.urlencode(textmod)
print(textmod)
#输出内容:user=admin&password=admin
header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'}
url='http://192.168.199.1:8000/mainsugar/loginGET/'
req = request.Request(url='%s%s%s' % (url,'?',textmod),headers=header_dict)
res = request.urlopen(req)
res = res.read()
print(res)
#输出内容(python3默认获取到的是16进制'bytes'类型数据 Unicode编码,如果如需可读输出则需decode解码成对应编码):b'\xe7\x99\xbb\xe5\xbd\x95\xe6\x88\x90\xe5\x8a\x9f'
print(res.decode(encoding='utf-8'))
#输出内容:登录成功

 

 

POST请求:

python2.7:

 

import json,urllib2
textmod={"jsonrpc": "2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"auth": None,"id":1}
textmod = json.dumps(textmod)
print(textmod)
#输出内容:{"params": {"password": "zabbix", "user": "admin"}, "jsonrpc": "2.0", "method": "user.login", "auth": null, "id": 1}
header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',"Content-Type": "application/json"}
url='http://192.168.199.10/api_jsonrpc.php'
req = urllib2.Request(url=url,data=textmod,headers=header_dict)
res = urllib2.urlopen(req)
res = res.read()
print(res)
#输出内容:{"jsonrpc":"2.0","result":"2c42e987811c90e0491f45904a67065d","id":1}

 

python3.5:

from urllib import parse,request

import json

textmod={"jsonrpc": "2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"auth": None,"id":1}

#json串数据使用

textmod = json.dumps(textmod).encode(encoding='utf-8')

#普通数据使用

textmod = parse.urlencode(textmod).encode(encoding='utf-8')

print(textmod)

#输出内容:b'{"params": {"user": "admin", "password": "zabbix"}, "auth": null, "method": "user.login", "jsonrpc": "2.0", "id": 1}'

header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',"Content-Type": "application/json"}

url='http://192.168.199.10/api_jsonrpc.php'

req = request.Request(url=url,data=textmod,headers=header_dict)

res = request.urlopen(req)

res = res.read()

print(res)

#输出内容:b'{"jsonrpc":"2.0","result":"37d991fd583e91a0cfae6142d8d59d7e","id":1}'

print(res.decode(encoding='utf-8'))

#输出内容:{"jsonrpc":"2.0","result":"37d991fd583e91a0cfae6142d8d59d7e","id":1}

  

cookie的使用(python3.5):

from urllib import request,parse

from http import cookiejar

#创建cookie处理器

cj = http.cookiejar.CookieJar()

opener = request.build_opener(request.HTTPCookieProcessor(cj), request.HTTPHandler)

request.install_opener(opener)

#下面进行正常请求

......

  

 

<think>我们正在讨论Python requests库中GETPOST请求的区别。根据用户提供的引用,我们可以总结出以下几点关键区别: 1. **URL参数形式**: - GET请求:参数通常附加在URL之后,以查询字符串(QueryString)的形式出现,例如:`http://example.com/resource?key1=value1&key2=value2`[^2]。 - POST请求:参数通常包含在请求体中(Form表单数据或JSON等),不会直接暴露在URL中[^2][^4]。 2. **参数传递方式**: - GET请求:参数通过`params`参数传递,例如: ```python import requests params = {'key1': 'value1', 'key2': 'value2'} response = requests.get('http://example.com', params=params) ``` - POST请求:参数通过`data`或`json`参数传递,例如: ```python # 表单形式 data = {'key1': 'value1', 'key2': 'value2'} response = requests.post('http://example.com', data=data) # JSON形式 import json response = requests.post('http://example.com', json=data) # 等价于设置data=json.dumps(data)并设置Content-Type为application/json ``` 3. **安全性**: - GET请求的参数在URL中可见,因此不适合传递敏感信息(如密码)。 - POST请求的参数在请求体中,相对更安全(但HTTPS才是真正的安全保障)。 4. **数据长度限制**: - GET请求:由于URL长度有限制(因浏览器服务器而异),不适合传输大量数据。 - POST请求:理论上没有长度限制,适合传输大量数据(如图片、文件等)。 5. **幂等性**: - GET请求是幂等的,即多次执行相同的GET请求对资源状态没有影响(通常用于获取数据,不修改资源)[^1]。 - POST请求不是幂等的,每次提交可能会创建新资源或导致资源状态改变(例如提交表单)。 6. **缓存**: - GET请求可以被缓存,也可以保留在浏览器历史记录中[^1]。 - POST请求不会被缓存,也不会保留在浏览器历史记录中。 下面是一个对比表格: | **特性** | **GET 请求** | **POST 请求** | |----------------|------------------------------|-------------------------------| | **参数位置** | URL查询字符串 | 请求体(Form/JSON) | | **参数传递** | `params`参数 | `data`或`json`参数 | | **安全性** | 参数在URL中,较低 | 参数在请求体中,相对较高 | | **数据长度** | 受URL长度限制 | 无限制(理论上) | | **幂等性** | 幂等(多次请求结果相同) | 非幂等(可能改变资源状态) | | **缓存** | 可缓存 | 不可缓存 | | **常用场景** | 获取数据(搜索、过滤等) | 提交数据(登录、上传文件等) | ### 示例代码 #### GET请求示例 ```python import requests # 通过params传递参数 response = requests.get( 'https://api.example.com/data', params={'page': 1, 'per_page': 20}, headers={'Authorization': 'Bearer token123'} ) print(response.json()) ``` #### POST请求示例 ```python import requests # 表单形式提交 form_data = {'username': 'admin', 'password': 'secret'} response_form = requests.post( 'https://api.example.com/login', data=form_data ) # JSON格式提交 json_data = {'title': 'New Post', 'content': 'Hello, world!'} response_json = requests.post( 'https://api.example.com/posts', json=json_data, # 自动设置Content-Type为application/json headers={'Authorization': 'Bearer token123'} ) ``` ### 注意事项 - 当使用POST请求发送JSON数据时,推荐使用`json`参数而非手动`json.dumps`设置`Content-Type`头,因为`requests`会自动处理[^4]。 - 如果需要上传文件,可以使用`files`参数: ```python files = {'file': open('report.xls', 'rb')} response = requests.post('https://httpbin.org/post', files=files) ``` --- ### §§相关问题§§ 1. **在Python requests中如何设置请求头(Headers)?** 2. **如何处理requests库返回的响应(Response)对象?** 3. **如何通过requests库发送带文件的POST请求?** 4. **GETPOST请求在安全性方面有哪些最佳实践?** </think> ### Python Requests库中GETPOST请求的区别 #### 1. **参数传递方式** - **GET请求**: 参数通过URL的**查询字符串(QueryString)**传递,格式为`?key1=value1&key2=value2` ```python import requests response = requests.get('https://api.example.com/data', params={'page': 1, 'limit': 10}) # 实际URL变为 https://api.example.com/data?page=1&limit=10 ``` 参数在URL中明文可见[^2]。 - **POST请求**: 参数通过**请求体(Request Body)**传递,支持多种格式: ```python # 表单格式 (默认) requests.post('https://api.example.com/submit', data={'name': 'Alice', 'age': 30}) # JSON格式 (自动添加Content-Type头) requests.post('https://api.example.com/submit', json={'name': 'Alice', 'age': 30}) # 文件上传 requests.post('https://api.example.com/upload', files={'file': open('data.txt', 'rb')}) ``` 参数在请求体中隐藏。 #### 2. **数据长度限制** | 请求类型 | 限制机制 | 示例场景 | |----------|--------------------------|------------------------------| | GET | URL长度受限(约2048字符) | 搜索引擎查询参数[^2] | | POST | 无硬性长度限制 | 文件上传、表单提交大数据 | #### 3. **安全性与幂等性** - **GET**: - 参数暴露在URL浏览器历史中,**不适合传输敏感信息**(如密码) - 具有**幂等性**:多次执行结果相同(仅查询不修改资源) - **POST**: - 参数在请求体中,**相对更安全**(需配合HTTPS) - **非幂等**:多次提交可能创建重复资源(如多次提交订单)[^1] #### 4. **缓存机制对比** ```mermaid graph TD A[客户端请求] --> B{请求类型} B -->|GET| C[可被浏览器缓存] B -->|POST| D[不可缓存] C --> E[减少服务器负载] D --> F[每次需访问服务器] ``` #### 5. **使用场景对比** | 场景 | 推荐方法 | 原因说明 | |--------------------|----------|------------------------------| | 数据检索/过滤 | GET | 参数简单,可缓存[^3] | | 登录认证 | POST | 密码需隐藏 | | 文件上传 | POST | 突破URL长度限制[^4] | | 资源创建/修改 | POST | 非幂等操作需求 | #### 6. **请求示例对比 **GET请求示例**(带参数头部): ```python headers = {'Authorization': 'Bearer token123'} response = requests.get( 'https://api.example.com/users', params={'role': 'admin', 'active': 'true'}, headers=headers ) ``` **POST请求示例**(JSON数据): ```python data = {'title': 'API指南', 'content': 'GET/POST详解'} response = requests.post( 'https://api.example.com/articles', json=data, # 自动序列化为JSON并设置Content-Type headers={'X-API-Key': 'your_key'} ) ``` > **关键注意**: > - GET请求的`params`参数会被自动编码到URL中 > - POST请求使用`json=`参数比手动`json.dumps()`更便捷(自动处理头部) --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值