【问题标题】:Python Requests Messing with Links in my Data DictPython 请求与我的数据字典中的链接混淆
【发布时间】:2019-04-23 20:40:11
【问题描述】:

我有一个如下所示的请求:

data = {
    'USER': params['PARTNER'],
    'PWD': params['PWD'],
    'RETURNURL': 'https://my-site.com/',
    'CURRENCY': 'USD',
}

request = requests.post(url=URL, data=data, verify=False)

当我在 shell 中以相同的 cURL 命令运行此命令时,完全没有问题。但是当我通过请求执行此操作时,似乎有些东西被 RETURNURL 参数弄乱了。它完美地保存在 cURL 中,但是当从请求处理时,当我在请求的另一端看到它时,它最终看起来像这样,而事情就是不起作用:

https%3A%2F%2Fmy-site.com%2F

提前感谢,一直在这!


在 cURL 中成功使用的实际命令是这样的:

curl https://pilot-payflowpro.paypal.com \
  -s \
  --insecure \
  -d PARTNER=PayPal \
  -d PWD=MyPassword \
  -d VENDOR=MyMerchantID \
  -d USER=MyMerchantID \
  -d TENDER=C \
  -d ACCT=5105105105105100 \
  -d TRXTYPE=S \
  -d EXPDATE=1221 \
  -d RETURNURL=https://my-site.com/
  -d AMT=1.00

请注意,一切都运行良好,但我提交的参数是一个 URL,它根本无法正常工作,并且格式全乱了。

【问题讨论】:

  • 显示你正在使用的 curl 命令。什么在处理另一端的数据?它是您控制的应用程序吗?
  • @DanielRoseman 我正在访问 PayPal API,将在 30 秒内更新帖子并提供更多信息
  • 好的,但是你怎么知道 PayPal 是如何接收 URL 的?
  • @DanielRoseman 好吧,RETURNURL 参数不是必需的,所以如果我把它拿出来,一切正常。但我需要那里的参数来为我的用例定制功能。
  • 此处与此问题类似 - stackoverflow.com/questions/23496750/…

标签: python curl python-requests


【解决方案1】:

假设您以 JSON 格式发送数据,然后使用 json 参数而不是 data 发送数据

request = requests.post(url=URL, json=data, verify=False)

【讨论】:

  • 在原帖中添加了一些关于 cURL 命令的更多细节以供参考。
  • 我会仔细检查一下; JSON 字符串值不会得到处理(您可以通过在字典上调用 json.dumps 来验证)。我只是在本地运行这两种情况,使用 Charles 代理来检查有效负载。 JSON 负载未经修改发送,字符串负载是 URL 编码的。
【解决方案2】:

使用--trace-ascii log.txt 登录 curl 后期处理。

卷曲

=> Send data, 161 bytes (0xa1)
0000: PARTNER=PayPal&PWD=MyPassword&VENDOR=MyMerchantID&USER=MyMerchan
0040: tID&TENDER=C&ACCT=5105105105105100&TRXTYPE=S&EXPDATE=1221&RETURN
0080: URL=https://my-site.com/&AMT=1.00

data = data_dict的请求

Content-Length: 169

ACCT=5105105105105100&TENDER=C&EXPDATE=1221&PARTNER=PayPal&RETURNURL=https%3A%2F%2Fmy-site.com%2F&VENDOR=MyMerchantID&USER=MyMerchantID&TRXTYPE=S&AMT=1.00&PWD=MyPassword

因此,您可以尝试将数据作为字符串发布,正如@Mortz 所说。

import requests

data = {
    'PARTNER':'PayPal',
    'VENDOR':'MyMerchantID',
    'TENDER':'C',
    'ACCT':'5105105105105100',
    'TRXTYPE':'S',
    'EXPDATE':'1221',
    'AMT':'1.00',
    'USER': 'MyMerchantID',
    'PWD': 'MyPassword',
    'RETURNURL': 'https://my-site.com/',
}
data = "&".join("{}={}".format(k,v)  for k,v in data.items())
print(len(data), data)

url = "https://pilot-payflowpro.paypal.com"

request = requests.post(url=URL, data=data, verify=False)

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2022-06-17
    • 2019-03-28
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多