【问题标题】:How to encode an array as a http get parameter?如何将数组编码为 http get 参数?
【发布时间】:2021-04-10 22:40:14
【问题描述】:

我的目标是发送一个带有数组作为参数值的 API 请求。请求 URL 是 https://api.twitter.com/2/tweets/search/recent?max_results=100&tweet.fields=lang,created_at&query=%23test。当我使用 URL 作为字符串时,它可以工作。

但是,由于使用参数字典更方便,我想使用语法response = requests.request('GET', url, headers=header, params=params),因为它允许我在单个对象中设置所有参数。

为此,我的参数字典如下所示。

params = {
    "max_results": 100,
    "tweet.fields": ["lang","created_at"],
    "query": "%23test"
}

这里的问题是生成的 URL https://api.twitter.com/2/tweets/search/recent?max_results=100&tweet.fields=lang&tweet.fields=created_at&query=%23test

此 URL 不起作用,因为 tweet.fields 使用 tweet.fields=lang&tweet.fields=created_at 编码,这违反了 Twitter 的重复参数政策

'{"errors":[{"parameters":{"tweet.fields":["lang","created_at"]},"message":"Duplicate parameters are not allowed:  the `tweet.fields` query parameter"}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}'

另一个想法是将参数更改为"tweet.fields": {"lang","created_at"},,这会导致与其他参数字典相同的 URL。

在继续使用参数字典的同时,如何以将参数编码为tweet.fields=lang,created_at 而不是tweet.fields=lang&tweet.fields=created_at 的方式对参数进行编码?

【问题讨论】:

    标签: python twitter python-requests http-get


    【解决方案1】:

    如果您需要像lang, created_at 这样的字符串,那么只需在其中放置一个即可。

    params = {
        "max_results": 100,
        "tweet.fields": "lang,created_at",
        "query": "%23test"
    }
    

    您也可以使用.join 方法自动生成一个。

    params = {
        "max_results": 100,
        "tweet.fields": ",".join(["lang", "created_at"]) ,
        "query": "%23test"
    }
    

    【讨论】:

    • 非常感谢。我想,它不会工作,因为它将它编码为tweet.fields=lang%2Ccreated_at,但似乎他们正在再次解码%2
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 2017-02-17
    • 2023-03-10
    • 2012-12-26
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多