如何将数组编码为http get参数?

How to encode an array as a http get parameter?

我的目标是发送一个 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

如果您需要像 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"
}