我正在使用python请求向特定网址提交帖子请求。此url有一个查询参数,其中包含我正在上传的文件的实际文件路径,实际冒号(':')和反斜杠('\')(它不接受%3A或%5C)。我不知道该怎么做。
这是我的代码:
with requests.Session() as s:
payload_10_vo_params = {
'hidInputControlValues': this_hidInputControlValues10,
'hidFormNames': this_hidFormNames10,
'hidToken': this_hidToken10,
'hidFileNm': r"C:\fakepath\{}".format(this_FileName),
'hidFileSourceId': '',
'ReUploadInd': ''
}
payload10_mpe_vo = MultipartEncoder(
[
('hidLoanTranSaveFlag', 'TRUE'),
('hidUpfrontMIPct', ''),
('radLeadRequestOptBtnImportRetNum', 'LUPL'),
('txtCorrCompId', ''),
('cboLeadRequestFileTypCd', 'DU32'),
('txtLeadRequestSelectFile', (this_FileName, open(this_FileName, 'rb'), 'application/octet-stream')),
('txaLoanTranComments', ''),
], boundary=ct_disp_bndry_10_final_str)
headers10 = {
"Accept": "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*",
"Accept-Language": "en-US",
"User-Agent": "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/7.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)",
"UA-CPU": "AMD64",
"Content-Type": "multipart/form-data; boundary={}".format(ct_disp_bndry_10_final_str),
"Referer": "referer string",
"Host": "host string"}
resp10 = s.post(url10, headers=headers10, params=payload_10_vo_params, data=payload10_mpe_vo)
这是来自fiddler的响应url的值,请参阅最终参数(hidFileNm
的值),其他所有内容都匹配正常,(这些特殊字符用于特殊字符§,由请求完美编码) )。
POST/SRVCorrBP/LeadMgmt/Application/Lead/LeadSubmitNew.jsp?hidInputControlValues= DU32 Y LUPL C%3A%5CFAKEPATH%5CMAYRA%20CORTEZ.FNM &hidFormNames= frmLoanTran=TRUE~ & hidToken = 1508961847871LSXG_EDTLeadSummary& hidFileNm = C:\ fakepath \ filename& hidFileSourceId =& ReUploadInd =
这就是我得到的:
/SRVCorrBP/LeadMgmt/Application/Lead/LeadSubmitNew.jsp?hidInputControlValues=%C2%A7DU32%C2%A7Y%C2%A7LUPL%C2%A7C%3A%5CFAKEPATH%5CBOPPPMVO.FNM%C2%A7&hidFormNames=% C2%〜A7frmLoanTran TRUE〜%C2%A7&安培; hidToken = 1512952710233LSXG_EDTLeadSummary&安培; hidFileNm = C%3A%5Cfakepath%5Cfilename&安培; hidFileSourceId =安培; ReUploadInd =
如您所见,hidFileNm
参数应为
hidFileNm = hidFileNm = C:\ fakepath \文件名
但我的要求是:
hidFileNm = C%3A%5Cfakepath%5Cfilename
之前我曾多次使用过请求,但这是我第一次遇到这个问题。
答案 0 :(得分:1)
编辑:之前有效,但似乎他们改变了一些东西而且它不再起作用了。
requests
会在将参数添加到网址之前自动转义参数。
您必须使用url和所有参数手动创建字符串。
创建字符串key=value
args = ['{}={}'.format(k, v) for k,v in payload_10_vo_params.items()]
创建一个字符串key1=value1&key2=value2
args_in_one_string = "&".join(args)
创建带参数的网址
url10 = url10 + "?" + args_in_one_string
编辑: prepared-request中有一些request issues和示例
from requests import Request, Session
s = Session()
req = Request('GET', url)
prepped = s.prepare_request(req)
prepped.url = prepped.url.replace('.', '%2E')
resp = s.send(prepped)
但我不知道它是否有帮助。
也许您必须使用urllib
答案 1 :(得分:1)
你可以尝试
from urllib.parse import urlencode
payload_10_vo_params = urlencode(payload_10_vo_params, doseq=True, quote_via=lambda x,y,z,w: x)
在致电s.post
之前。
在内部requests
使用urlencode
获取params
的字符串,默认情况下urlencode
将调用quote_plus()
来转义参数。使用选项quote_via
可以更改引用url所调用的函数。在这种情况下,使用一个只返回其第一个参数的虚引号函数。