• 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/

  • 相关阅读:
    mysql优化——show processlist命令详解
    Nginx常见错误
    nginx应用总结(1)--基础认识和应用配置
    mac键盘在ubuntu下开启fn功能按键
    字符串逆序输出--递归
    getchar返回int类型
    c语言中字符串跨行书写的问题
    ascii
    c语言中不允许在函数外部给全局变量赋值
    CF和OF的区别
  • 原文地址:https://www.cnblogs.com/tjp40922/p/15333553.html
Copyright © 2020-2023  润新知