如何在使用 aiohttp session.get 发出请求时发送 etag 或最后修改时间
How to send an etag or last modified while making a request with aiohttp session.get
- 我每分钟加载多个 Feed URL
- 我想发送一个 http get 请求,如果自上次加载以来数据发生变化,则获取 200 状态码和完整数据
- 我想要 http 状态代码 304 并且没有响应 body 如果数据自上次加载后没有改变
- Python 如果我使用他们的库发送 GET 请求,feedparser 提供 HERE 这个功能
- 如何使用 aiohttp 库执行此操作
如何在 GET 请求中发送 etag 和 last modified
async with session.get(url) as response:
text = await response.text()
print(response.headers.get('etag'), response.headers.get('Last-Modified'))
如何发送 etag 和最后修改时间并模拟类似于上述库的行为?
更新 1
这里是一些详细的代码
import asyncio
import aiohttp
async def load_feed(session, url):
# Keep this an empty string for the first request
etag = 'fd31d1100c6390bd8a1f16d2703d56c0'
# Keep this an empty string for the first request
last_modified='Mon, 11 May 2020 22:27:44 GMT'
try:
async with session.get(url, headers={'etag': etag, 'Last-Modified': last_modified}) as response:
t = await response.text()
print(response.headers.get('etag'), response.headers.get('Last-Modified'), response.status, len(t), response.headers)
except Exception as e:
print(e)
async def load_feeds():
try:
async with aiohttp.ClientSession() as session:
tasks = []
for url in ['https://news.bitcoin.com/feed/']:
task = asyncio.ensure_future(load_feed(session, url))
tasks.append(task)
await asyncio.gather(*tasks, return_exceptions=True)
except:
pass
asyncio.get_event_loop().run_until_complete(load_feeds())
期望:
- 第一次发送请求没有headers
- 获取带有 etag 和 Last-modified 以及完整响应的响应代码 200
- 使用 etag 和 Last-modified
再次发送请求
- 得到没有响应的响应代码 304body
发生了什么
- 我每次都收到状态代码 200 和完整响应 body
- 也尝试了其他几个网址 https://coindesk.com/feed
Last-Modified
是响应 header,对于您将使用 If-Modified-Since
:
的请求
async def load_feed(session, url):
headers = {
"ETag": "fd31d1100c6390bd8a1f16d2703d56c0",
"If-Modified-Since": "Mon, 11 May 2020 22:27:44 GMT"
}
try:
async with session.get(url, headers=headers) as response:
t = await response.text()
print(response.headers.get("ETag"), response.headers.get('Last-Modified'), response.status, len(t))
except Exception as e:
print(e)
输出(通知status=304):
"fd31d1100c6390bd8a1f16d2703d56c0" Mon, 11 May 2020 22:27:44 GMT 304 0
- 我每分钟加载多个 Feed URL
- 我想发送一个 http get 请求,如果自上次加载以来数据发生变化,则获取 200 状态码和完整数据
- 我想要 http 状态代码 304 并且没有响应 body 如果数据自上次加载后没有改变
- Python 如果我使用他们的库发送 GET 请求,feedparser 提供 HERE 这个功能
- 如何使用 aiohttp 库执行此操作
如何在 GET 请求中发送 etag 和 last modified
async with session.get(url) as response: text = await response.text() print(response.headers.get('etag'), response.headers.get('Last-Modified'))
如何发送 etag 和最后修改时间并模拟类似于上述库的行为?
更新 1
这里是一些详细的代码
import asyncio
import aiohttp
async def load_feed(session, url):
# Keep this an empty string for the first request
etag = 'fd31d1100c6390bd8a1f16d2703d56c0'
# Keep this an empty string for the first request
last_modified='Mon, 11 May 2020 22:27:44 GMT'
try:
async with session.get(url, headers={'etag': etag, 'Last-Modified': last_modified}) as response:
t = await response.text()
print(response.headers.get('etag'), response.headers.get('Last-Modified'), response.status, len(t), response.headers)
except Exception as e:
print(e)
async def load_feeds():
try:
async with aiohttp.ClientSession() as session:
tasks = []
for url in ['https://news.bitcoin.com/feed/']:
task = asyncio.ensure_future(load_feed(session, url))
tasks.append(task)
await asyncio.gather(*tasks, return_exceptions=True)
except:
pass
asyncio.get_event_loop().run_until_complete(load_feeds())
期望:
- 第一次发送请求没有headers
- 获取带有 etag 和 Last-modified 以及完整响应的响应代码 200
- 使用 etag 和 Last-modified 再次发送请求
- 得到没有响应的响应代码 304body
发生了什么 - 我每次都收到状态代码 200 和完整响应 body
- 也尝试了其他几个网址 https://coindesk.com/feed
Last-Modified
是响应 header,对于您将使用 If-Modified-Since
:
async def load_feed(session, url):
headers = {
"ETag": "fd31d1100c6390bd8a1f16d2703d56c0",
"If-Modified-Since": "Mon, 11 May 2020 22:27:44 GMT"
}
try:
async with session.get(url, headers=headers) as response:
t = await response.text()
print(response.headers.get("ETag"), response.headers.get('Last-Modified'), response.status, len(t))
except Exception as e:
print(e)
输出(通知status=304):
"fd31d1100c6390bd8a1f16d2703d56c0" Mon, 11 May 2020 22:27:44 GMT 304 0