zoukankan      html  css  js  c++  java
  • 【Python】Http Post请求四种请求体的Python实现

    前言

    前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现。

    Happy post man

    这里说的各类Post请求主要包含json格式、xml格式、文件上传(form-data)、及默认传递的urlencoded。在开始介绍相关的Python用法之前,我们首先我们来了解一下HTTP的报文结构。

    HTTP的报文结构

    上面这张图是Fiddle捕获的一个实际请求报文,它清晰的展示了HTTP 消息的结构。详情如下:

    • 请求行:即第一排用空格分割成的三个小块,分别对应请求方法、请求URL、HTTP协议版本三个部分。
    • 请求头:从第二行开始到倒数第二行都是我们的请求头(headers)。
    • 消息主体:截图的最后一行是请求体,也就是我们要发送的数据的主体,消息主体(entity-body)。
      也就是说一个正常的post请求主要由请求行,请求头,消息主体组成。接下来我们来了解一下什么是Content-Type。

    Content-Type的定义

    要了解Content-Type首先我们要先对HTTP/1.1 协议有一定的了解。

    众所周知,HTTP/1.1 规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 8种,其中 POST 一般用来向服务端提交数据。
    但是可能很多人不知道的是,虽然HTTP/1.1协议规定 了POST 提交的数据必须放在消息主体(entity-body)中,但并没有规定数据必须使用什么样的编码方式。也就是说,开发者完全可以自己决定消息主体的格式。

    但是数据除了请求方发送之外,还要服务端能够解析才有意义。而这个解析操作的第一步通常就是是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体的编码方式,然后再对数据进行对应的解析操作。也就是说请求头中的Content-Type字段用于规定请求体的编码格式,服务端代码需要使用它对接收到的消息主体进行解析。

    Content-Type的格式种类

    我们前面说了HTTP/1.1没有规定协议编码方式,但是随着协议的应用推广,已经慢慢的形成了四种最常用的编码方式,基本上形成了相应的规范,即基本固定的Content-Type取值application/x-www-form-urlencoded(默认格式)、application/json、text/xml、multipart/form-data,与默认传递的urlencoded、json格式、xml格式、文件格式一 一对应。

    接下来我们会每个编码方式的应用场景及Python实现分别进行介绍。我们此次主要使用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

  • 相关阅读:
    package相关知识
    【算法设计与分析】5个数7次比较排序的算法
    Android下的应用编程——用HTTP协议实现文件上传功能
    5个数通过7次比较排序的方法
    数据库范式(1NF、2NF、3NF、BCNF)
    HttpDownloader2011年09月20日 写好用于下载的类 并且封装好
    POJ 1692 DP
    POJ 1682 多重DP
    TYVJ 1744 逆序对数(加强版)
    POJ 2151 概率DP
  • 原文地址:https://www.cnblogs.com/Detector/p/9404391.html
Copyright © 2011-2022 走看看