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\r\nContent-Disposition: form-data;
name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"products\"\r\n\r\n {}\r\n------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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM