【问题标题】:python requests post to url query parameter requires special characterpython请求post到url查询参数需要特殊字符
【发布时间】:2017-12-11 00:57:54
【问题描述】:

我正在使用 python 请求将发布请求提交到特定的 url。这个 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

我之前使用过多次请求,但这是我第一次遇到这个问题。

【问题讨论】:

  • 您必须手动创建带有所有参数的url

标签: python python-3.x python-requests


【解决方案1】:

编辑:它以前工作过,但似乎他们改变了一些东西,它不再工作了。


requests 在将参数添加到 url 之前自动转义参数。

您必须手动创建带有 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-requestrequest 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

【讨论】:

  • 谢谢!我明天会做这个,让你知道我发现了什么。
【解决方案2】:

你可以试试

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 调用的函数。在这种情况下,使用了一个只返回其第一个参数的虚拟引号函数。

【讨论】:

  • 谢谢@Roun!我明天会试试这个,让你知道我发现了什么。
  • 嘿Roun,我用你的说明更新了我的代码,它似乎适用于除“\”之外的所有内容。它可能只是请求模块处理反斜杠字符的方式。如果我在不使用请求模块的情况下完成整个操作,我会看看会发生什么。不过,我可能会将您的代码用于其他用途,谢谢!
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多