zoukankan      html  css  js  c++  java
  • requests提交form表单

    问题:

    对接接口,发现对方的接口使用form-data进行数据提交,直接使用requests库的data参数对接,会报参数错误:

    params = {
        'timestamp':timestamp,
        'nonce':nonce,
        'apikey':APIKEY,
        'signature': signature
    }
    data = {
        'name': name,
        'phone': phone,
        'idnum': idnum,
        'products': [201,]
    }
    resp = requests.post(URL, data=data, params=params,
                         verify=False, timeout=10)      

    错误提示

    报错信息

    解决方案

    这一块Requests包做的不是很好,做法具体如下:

    1.一种是手动组建form-data并加上headers;数,data参数需要自己用boundary来分隔为指定的形式

    2.另一种是通过files参数传递form-data,files参数则以元组的形式传入;

    3.第三方模块,requests-toolbelt

    
    
    # 方案一:
    params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
    }
    payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
    name="phone" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
    name="idnum" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
    name="name" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
    name="products" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,])
    headers = {
    "content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
    }
    resp = requests.post(URL, data=payload, params=params,
    verify=False, timeout=10, headers=headers)

    # 方案二:以传入files参数
    import json
    params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
    }
    data = {
    'name':(None, name),
    'phone': (None, str(phone)),
    'idnum': (None, idnum),
    'products': (None, json.dumps([201,]))
    }
    resp = requests.post(URL, files=data, params=params,
    verify=False, timeout=10)
    print(resp.status_code)
    print(resp.request.url)
    print(resp.request.body)
    print(resp.text )
     

    结果

    方案三:利用第三方模块(requests-toolbelt)

     1、安装

    pip install requests-toolbelt

    这里我们会用到MultipartEncoder方法

    MultipartEncoder上传文件用法

    import requests
    from requests_toolbelt import MultipartEncoder
    
    encoder = MultipartEncoder({'field': 'value',
                                'other_field':'other_value'},boundary="--asddddddddddddddddd")
    r = requests.post('https://httpbin.org/post', data=encoder,
                      headers={'Content-Type': encoder.content_type})

    MultipartEncoder填写表格用法

    from requests_toolbelt import MultipartEncoder
    import requests
    
    m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})
    
    r = requests.post('http://httpbin.org/post', data=m,
                      headers={'Content-Type': m.content_type})

    转自:https://www.freesion.com/article/248781736/

  • 相关阅读:
    如何巧妙着运用「位运算」来解决问题?
    一文读懂一台计算机是如何把数据发送给另一台计算机的
    Java集合与泛型中的几个陷阱,你掉进了几个?
    【链表问题】打卡10:将搜索二叉树转换成双向链表
    【链表问题】打卡9:将单链表的每K个节点之间逆序
    【链表问题】打卡8:复制含有随机指针节点的链表
    单例模式中的volatile关键字
    链表回文判断(基于链表反转)—Java实现
    设计模式之单例模式
    Spring的IoC与AOP的理解
  • 原文地址:https://www.cnblogs.com/tjp40922/p/15333553.html
Copyright © 2011-2022 走看看