码迷,mamicode.com
首页 > 编程语言 > 详细

【Python】Http Post请求四种请求体的Python实现

时间:2018-08-02 01:53:08      阅读:6053      评论:0      收藏:0      [点我收藏+]

标签:json格式   port   post请求   multi   服务器   let   roc   call   .post   

前言

前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在看Http请求相关的内容,所以决定总结一下。
技术分享图片

Content-Type

Content-Type的作用

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据。一个正常的post请求主要包括请求行,请求头,请求主体。协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是何种方式编码,再对主体进行解析。

技术分享图片

上图是一个实际的请求报文,其中第一排的三个元素分别是请求方法、请求URL、HTTP协议及版本,统称为请求行,分别是请求方法,资源名称,HTTP版本号,从第二行开始一直到倒数第二行都是请求头,最后一行是请求体。

Content-Type的格式种类

Content-Type的格式常见的有四种

- application/x-www-form-urlencoded(默认格式)
- application/json
- text/xml
- multipart/form-data

演示代码说明

我们本次使用http://httpbin.org/来做演示。httpbin是一个专门用来测试 HTTP 请求及响应的网站,其github开源地址是https://github.com/requests/httpbin。作者另外一个开源库就是大名鼎鼎的requests。

application/x-www-form-urlencoded格式

这是post请求最常见也是默认的数据提交格式。它要求数据名称(name)和数据值(value)之间以等号相连,与另一组name/value值之间用&相连。例如:parameter1=12345&parameter2=23456。将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。这是最常见post提交数据的方式,以form表单形式提交数据。

参考Python实现

import requests
datas = {"param1": "Detector", "param2": "cnblogs"}
r = requests.post("http://httpbin.org/post", data=datas)
print(r.text)
print(r.status_code)

我们在代码中没有进行Content-Type的设置,但是我们来看看Fiddler抓包的结果。
技术分享图片

可以看到Content-Type已经被自动填充为application/x-www-form-urlencoded了。

application/json格式

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

参考Python实现

import json
import requests
headers = {'Content-Type': 'application/json'}
datas = json.dumps({"param1": "Detector", "param2": "cnblogs"})
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

Fiddler抓包结果
技术分享图片

text/xml数据格式

它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC(XML Remote Procedure Call) 请求数据是这样的:

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>

参考Python实现

import requests
headers = {"Content-Type": "text/xml"}
datas = """<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>"""
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

可以看到,我们和application/json请求的区别是,我们把请求的内容换成了xml格式的字符串,Content-Type换成了text/xml。

Fiddler抓包结果
技术分享图片

multipart/form-data数据格式

multipart/form-data主要用于文件上传,当我们使用它时,必须让 form表单的enctype 等于 multipart/form-data。直接来看一个请求示例,主要实现了上传本地的test.txt文件:

参考Python实现

import requests
files = {"file": open("C:/Users/Administrator/Desktop/test.txt", "rb")}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

Fiddler抓包结果
技术分享图片

参考文献
https://www.cnblogs.com/aaronjs/p/4165049.html
https://blog.csdn.net/u010256388/article/details/68491509
https://www.jianshu.com/p/3c790e98ea8d
https://www.cnblogs.com/softidea/p/5745369.html
https://blog.csdn.net/qq_39640877/article/details/80951327

【Python】Http Post请求四种请求体的Python实现

标签:json格式   port   post请求   multi   服务器   let   roc   call   .post   

原文地址:https://www.cnblogs.com/Detector/p/9404391.html

(3)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!