【问题标题】:Why is boto requests truncating my query string?为什么 boto 请求会截断我的查询字符串?
【发布时间】:2019-10-17 03:36:56
【问题描述】:

当尝试使用 botocore.vendored 请求从 lambda 发出请求时,我发现我的查询字符串被截断了。

我尝试将其构建为字符串、dict,甚至尝试构建一个编码的 url,但它们似乎都在第一个查询参数之后被截断

import base64
import os
import traceback
from urllib.parse import urlencode
from botocore.vendored import requests

ORIGIN = os.environ.get('ORIGIN')

def api_proxy(event, context):

    if event['queryStringParameters']:
        myParams = urlencode(event['queryStringParameters'],'utf-8')

    url = ORIGIN + event['path']

    print("URL: " + url)
    print("Params: " + myParams)

    try:
        if myParams:
            dataRequest = requests.get(url, params=myParams)
        else:
            dataRequest = requests.get(url)
        print("Requested URL: " + dataRequest.url)
    except:
        traceback.print_exc()

我正在打印该过程的三个不同部分,这就是我得到的结果:

URL: https://{my_domain}/premium/data/DefinedImage/png

Params: minY=47.00&minX=-15.00&maxY=61.00&maxX=5.00&width=1000&RUN=2019-05-30T09%3A00%3A00Z&styles=&FORECAST=%2B0&height=1200

Requested URL: https://{my_domain}/premium/data/DefinedImage/png?minY=47.00

我希望请求的 URL 是最后包含所有参数的完整 URL,但 request.get 似乎在第一个&符号处截断了我的 URL。

【问题讨论】:

  • myParams 应该是字典
  • 我试过了。 event['queryStringParameters'] 是一个字典,我最初是通过它传递的。那是我第一次遇到问题的地方,上面是我解决问题的地方。

标签: python python-3.x amazon-web-services aws-lambda python-requests


【解决方案1】:

requests 方法接受数据作为字典或字节串。这是在 Python 中通过使用 b 开始编码为字节的字符串来完成的,例如:b"my string"

如果将参数作为字节传递,您可能需要使用字节编码:

urllib.parse.urlencode(event['queryStringParameters'])

【讨论】:

    【解决方案2】:

    事实证明,在我尝试访问的端点的底层有一个身份验证重定向,它不对 url 进行编码,因此会截断查询字符串。

    我通过查看 dataRequest.history URL 发现了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2015-12-20
      • 2015-06-07
      • 2012-01-29
      • 1970-01-01
      • 2010-12-02
      • 2017-02-08
      相关资源
      最近更新 更多