Context:
This works:
import http.client
conn = http.client.HTTPSConnection("something-api.com")
payload = 'grant_type=client_credentials&client_id=123-123-123&client_secret=123123&scope=something something'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
conn.request("POST", "/connect/token", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
This does not. It returns { 'error':'invalid_client' }.
async def get_token(self):
params = {
"grant_type": "client_credentials",
"client_id": "123-123-123",
"client_secret": "123123",
"scope": "something something"
}
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
async with aiohttp.ClientSession() as session:
async with await session.post(
url="https://something-api.com/connect/token",
params=params,
headers=headers) as response:
return await response.json()
async def authorise(self):
response = await self.get_token()
# Returns { 'error':'invalid_client' }
return response
# -- Just so you can see how it's called:
authorise_task: tasks.Task = asyncio.create_task(example.authorise())
access_token = await authorise_task
Question:
I cannot understand what the difference is between them. Any ideas what might be happening?
I’ve also tried:
- Adding headers to the
ClientSession(headers=headers)too. - Using the URL and removing params
Other notes:
- aiohttp docs here: https://docs.aiohttp.org/en/stable/client_reference.html
- aiohttp version:
3.7.4.post0
Advertisement
Answer
in docs:
for GET query
params – Mapping, iterable of tuple of key/value pairs or string to be sent as parameters in the query string of the new request. Ignored for subsequent redirected requests (optional) Allowed values are: collections.abc.Mapping e.g. dict, aiohttp.MultiDict or aiohttp.MultiDictProxy collections.abc.Iterable e.g. tuple or list str with preferably url-encoded content (Warning: content will not be encoded by aiohttp)
for POST body
data – The data to send in the body of the request. This can be a FormData object or anything that can be passed into FormData, e.g. a dictionary, bytes, or file-like object. (optional)
json – Any json compatible python object (optional). json and data parameters could not be used at the same time.