python post body_python写http post请求的四种请求体

HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。常见的四种编码方式如下:

1、application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1 Content-Type:

application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

2、multipart/form-data

这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值,下面是示例

POST http://www.example.com HTTP/1.1

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA

Content-Disposition: form-data; name="text"

title

------WebKitFormBoundaryrGKCBY7qhFd3TrwA

Content-Disposition: form-data; name="file"; filename="chrome.png"

Content-Type: image/png

PNG ... content of chrome.png ...

------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

3、application/json

application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

4、text/xml

它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。

那么Python在调用外部http请求时,post请求怎么传请求体呢?说实话楼主只实践过【1、application/x-www-form-urlencoded】【2、multipart/form-data 】和【3、application/json】

一、application/x-www-form-urlencoded

import urllib

url = "http://www.example.com"

body_value = {"package": "com.tencent.lian","version_code": "66" }

body_value = urllib.urlencode(body_value)

request = urllib2.Request(url, body_value)

request.add_header(keys, headers[keys])

result = urllib2.urlopen(request ).read()

二、multipart/form-data

需要利用python的poster模块,安装poster:pip install poster

代码:

from poster.encode import multipart_encode

from poster.streaminghttp import register_openers

url = "http://www.example.com"

body_value = {"package": "com.tencent.lian","version_code": "66" }

register_openers()

datagen, re_headers = multipart_encode(body_value)

request = urllib2.Request(url, datagen, re_headers)

# 如果有请求头数据,则添加请求头

request .add_header(keys, headers[keys])

result = urllib2.urlopen(request ).read()

二、application/json

import json

url = "http://www.example.com"

body_value = {"package": "com.tencent.lian","version_code": "66" }

register_openers()

body_value = json.JSONEncoder().encode(body_value)

request = urllib2.Request(url, body_value)

request .add_header(keys, headers[keys])

result = urllib2.urlopen(request ).read()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了在 Python 3.6 中发送 HTTP/2 POST 请求,你需要安装并使用一个第三方库,比如 httplib2 或者 hyper。 下面是使用 httplib2 库发送 HTTP/2 POST 请求的示例代码: ``` import httplib2 h = httplib2.Http('.cache', disable_ssl_certificate_validation=True) h.add_credentials('username', 'password') response, content = h.request( 'https://http2.example.com/post', 'POST', headers={'Content-Type': 'application/x-www-form-urlencoded'}, body='key1=value1&key2=value2' ) print(response.status) print(content) ``` 如果你想使用 hyper 库发送 HTTP/2 POST 请求,可以使用下面的代码: ``` import hyper s = hyper.Session() r = s.post( 'https://http2.example.com/post', headers={'Content-Type': 'application/x-www-form-urlencoded'}, data='key1=value1&key2=value2' ) print(r.status_code) print(r.text) ``` 希望这些信息对你有帮助! ### 回答2: 要在Python 3.6中发送HTTP/2的POST请求,首先需要确保安装了相应的模块,比如`hyper`或`httpx`。以下是使用`httpx`模块发送HTTP/2的POST请求的示例代码: ```python import httpx async def post_request(): url = 'https://example.com' # 替换为目标网址 async with httpx.AsyncClient(http2=True) as client: payload = {'key1': 'value1', 'key2': 'value2'} # 替换为实际的请求参数 headers = {'Content-Type': 'application/x-www-form-urlencoded'} # 替换为实际的请求头部 response = await client.post(url, data=payload, headers=headers) print(response.text) # 需要使用asyncio运行异步函数 import asyncio asyncio.run(post_request()) ``` 在上述代码中,`httpx`模块提供了HTTP/2的支持,通过设置`http2=True`参数来启用HTTP/2协议。`post_request()`函数是异步函数,使用`asyncio.run()`函数来运行。 请注意,这仅是一个简单的示例,实际情况下,您可能需要根据目标网址的要求和其他需要的参数进行相应的修改。 ### 回答3: 在Python 3.6中,要发送HTTP/2的POST请求,可以使用`http.client`模块的`HTTPConnection`类。这个类提供了一种连接到HTTP服务器并发送请求的方法。 首先,我们需要创建一个HTTPConnection对象,将目标主机的服务器地址和端口作为参数传递给它。然后,我们可以使用request()方法来发送POST请求。我们还需要设置一些请求标头,例如Content-Type和Content-Length。 以下是一个示例代码的基本结构,展示了如何发送HTTP/2的POST请求: ```python import http.client # 创建HTTPConnection对象 conn = http.client.HTTPConnection("目标服务器地址", port=端口号) # 设置请求标头 headers = { 'content-type': 'application/json', 'content-length': '长度' } # 设置请求 body = { 'key1': 'value1', 'key2': 'value2' } # 发送POST请求 conn.request("POST", "/目标路径", body, headers) # 获取响应 res = conn.getresponse() # 打印响应状态码和内容 print(res.status, res.read().decode()) ``` 请注意,以上示例代码只是一个基本结构,需要根据你的具需求进行进一步修改。例如,将目标服务器地址、端口号和其它请求参数替换为正确的值。 此外,在使用以上代码之前,你需要在Python环境中安装相应的依赖包,例如`hyper`、`h2`等,以确保支持HTTP/2协议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值