zoukankan      html  css  js  c++  java
  • python+requests——发送post请求——各种情况

    
    

    requests库是 python3 中非常优秀的第三方库,它使用 Apache2 Licensed 许可证的 HTTP 库,用 Python 编写,真正的为人类着想。

    requests 使用的是 urllib3(python3.x中的urllib),因此继承了它的所有特性。

    Requests 会自动实现持久连接keep-alive,Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,

    支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,现代、国际化、人性化。

    Requests库中有7个主要的函数,分别是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。

    这七个函数中request()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。

    
    

    
    

    
    

    json和dict
    python中的dict类型要转换为json格式的数据需要用到json库:

    import json
     
    <json> = json.dumps(<dict>)
    <dict> = json.loads(<json>)
    需要注意的是python中并没有json类型这一说法,通过json.dumps(<dict>)转换的字典对象,最后得到的是一个字符串对象,

    也就是说,在python中json格式的数据实际上就是一个字符串

    >>> j = json.dumps(<dict>)
    >>> type(j)
    <class 'str'>
    虽说json格式的数据在python中是以字符串的类型存在的,但是通过str(<dict>)工厂函数所得到的结果同json.dumps(<dict>)方法所得到的结果是不相同的


    以看出来stringjs的区别在于引号。对于可以作为json.loads(<str>)参数对象的字符串,除了要满足字典类型的格式外,所有的字符串对象必须是双引号。


    Python Requests post 方法中 data 与 json 参数问题

    1.data参数

    你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式,header默认Content-Type: application/x-www-form-urlencoded,

    发送过来的抓包到的数据格式为:'username=amy&password=123'

    如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去,不会被编码为表单形式

    例如传'{"username": "amy", "password": "123"}',直接发出去,抓包的内容也是'{"username": "amy", "password": "123"}'

    2.json参数

    还可以使用 json 参数直接传递,然后它就会被自动编码,header默认'Content-Type': 'application/json'

    json发送过来的数据格式为:{"username": "amy", "password": "123"}

    3.实际场景中如何使用

    1)对页面接口抓包,如果Content-Type:application/json,则限制接受json格式,requests中可用json方法,

    或者使用data方法,headers加'Content-Type': 'application/json',postdata传string格式,不会自动编码格式

    2)对页面接口抓包,Content-Type:application/x-www-form-urlencoded; charset=UTF-8,则可使用data方法

    ===================================================================================================

     


    ===============================================================================================================

    带参数的get请求:

    参数在网页url后面:"url": "http://httpbin.org/get?key1=value1&key2=value2"

    import requests

    payload = {'key1': 'value1', 'key2': 'value2'}

    r = requests.get("http://httpbin.org/get", payload=payload )

    print(r.text)

    执行结果:
    
    

    {
    "args": {
    "key1": "value1",
    "key2": "value2"
    },
    "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.23.0",
    "X-Amzn-Trace-Id": "Root=1-5e501d6f-72b6f98a2655a02975b0fc47"
    },
    "origin": "122.194.13.251",
    "url": "http://httpbin.org/get?key1=value1&key2=value2"
    }


    ====================================================================================================









    import requests




    print('#------------------------------------------------------------------------------------------1')



    #发送不带参数、不带响应体的post请求:



    r = requests.post('http://httpbin.org/post')








    print('#------------------------------------------------------------------------------------------2')


    #发送带请求体参数的post请求,key:value:默认类型为即:content-type为application/x-www-form-urlencoded




    # x-www-form-urlencoded

    # 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…)
    # ,
    # 然后把这个字串append到url后面,用?分割,加载这个新的url。


    #pplication/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)



    payload = (('key1', 'value1'), ('key1', 'value2'))

    r = requests.post('http://httpbin.org/post', date=payload)




    print('#------------------------------------------------------------------------------------------3')


    #发送带响应体的post请求,json文件

    #multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    #如果提交表达,即需要设置content-type 即 设置 header


    下面:发送content-type为json格式的请求体

    import requests
    import json

    payload = (('key1', 'value1'), ('key1', 'value2'))

    header = { 'content-type':'application/json'}

    r = requests.post('http://httpbin.org/post', json.dumps(payload),headers=header) #注意:将payload参数转化为字典类型


    --------------------------------------------------------------------------------------------------------------

    方法二:


    import requests
    import json

    payload = (('key1', 'value1'), ('key1', 'value2'))

    r = requests.post('http://httpbin.org/post', json(payload)) #注意:将payload参数转化为字典类型

    ===============================================================================================================

    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    即大型文件:比如excel、视频文件等
    import requests

    x = {'file':open('C:\\Users\\del\\Desktop\\新建文本文档 (3).txt','rb')}

    r = requests.post('http://httpbin.org/post', files = x)

    print(r.text)


    -------------------------------------------------------------------------------------

    当然,也可以指定这个文件的一些描述信息,详细的如下:


    POST一个多部分编码(Multipart-Encoded)的文件

    Requests 使得上传多部分编码文件变得很简单:

    >>> url = 'http://httpbin.org/post'

    >>> file = {'file': open('report.xls', 'rb')}

    >>> r = requests.post(url, files=file)

    >>> r.text


    {
    ...
    "files": {
    "file": "<censored...binary...data>"
    },
    ...
    }


    你可以显式地设置文件名,文件类型和请求头:

    url = 'http://httpbin.org/post'


    files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

    r = requests.post(url, files=files)

     r.text
    {
    ...
    "files": {
    "file": "<censored...binary...data>"
    },
    ...
    }
    如果你想,你也可以发送作为文件来接收的字符串:

    >>> url = 'http://httpbin.org/post'
    >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

    >>> r = requests.post(url, files=files)
    >>> r.text
    {
    ...
    "files": {
    "file": "some,data,to,send\\nanother,row,to,send\\n"
    },
    ...
    }
    如果你发送一个非常大的文件作为 multipart/form-data 请求,你可能希望将请求做成数据流。

    默认下 requests 不支持, 但有个第三方包 requests-toolbelt 是支持的。你可以阅读 toolbelt 文档 来了解使用方法。














    =============================================================================================================
    Accept-Encoding:跟压缩有关,浏览器发送http请求给web服务器,http请求中的header有Accept-Encoding:gzip,deflate(告诉服务器,浏览器支持gzip压缩)
    
    
    
    Content-Length:发送给HTTP服务器数据的长度。
    
     
    
    
    Content-Type:即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
    
                  例如:Content-Type: application/x-www-form-urlencoded
    
    常见的媒体格式类型如下:
    
    text/html : HTML格式
    
    text/plain :纯文本格式 
    
    text/xml : XML格式
    
    image/gif :gif图片格式 
    
    image/jpeg :jpg图片格式
    
    image/png:png图片格式
    
    以application开头的媒体格式类型:
    
    application/xhtml+xml :XHTML格式
    
    application/xml : XML数据格式
    
    application/atom+xml :Atom XML聚合格式 
    
    application/json : JSON数据格式
    
    application/pdf :pdf格式
    
    application/msword : Word文档格式
    
    application/octet-stream : 二进制流数据(如常见的文件下载)
    
    application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
    
    另外一种常见的媒体格式是上传文件之时使用的:
    
    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    注意:gzip、compress以及deflate编码都是无损压缩算法,用于减少文件传输大小,不会导致信息丢失,其中gzip效率最高,使用最广。
  • 相关阅读:
    PHP 魔术函数
    创建静态链接库
    Linux C 子进程的调度
    Android开发(三) android布局
    谷歌(Google)算法面试题
    Android开发(二) 详细了解android开发
    制作makefile文件
    SHELL编程
    5 Rules For A Good Web Design
    非托管代码方法的命名约定
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/12343973.html
Copyright © 2011-2022 走看看