当前位置: 首页 > 知识库问答 >
问题:

aiohttp.request状态代码404的下载失败,但同步下载成功

秦跃
2023-03-14

我对API请求有一个奇怪的问题。问题是使用请求或浏览器时,我使用的url工作正常。但使用异步服务程序时,URL会失败并返回状态代码404。

下面是我的代码:我已经构建了一个异步下载函数get

""" download functions for asynchronous download """
import asyncio
from pathlib import Path
from typing import Union, Dict, Any

import aiohttp

HTTP_DEFAULT_TIME_OUT = 60 * 10


async def _get(
    url: Union[Path, str],
    timeout: aiohttp.ClientTimeout = aiohttp.ClientTimeout(),
    **kwargs: Union[aiohttp.BasicAuth, Dict[str, Any]]
) -> bytes:
    """
    Base function downloader with aiohttp and async session

    Args:
        url: remote path to file
        timeout: how long should it max take to download the file
        **kwargs: parameters to pass to the aiohttp get function:
            auth: aiohttp.BasicAuth("", "")
            params: Dict[str, Any]
            headers: Dict[str, Any]

    Returns:
        a bytes object
    """
    kwargs["timeout"] = timeout
    async with aiohttp.request("GET", url, **kwargs) as response:
        return await response.read()


def get(
    url: Union[Path, str],
    timeout: int = HTTP_DEFAULT_TIME_OUT,
    **kwargs: Union[aiohttp.BasicAuth, Dict[str, Any]]
) -> bytes:
    """
    download function handling async download with aiohttp

    Args:
        url: remote path to file
        timeout: how long should it max take to download the file
        **kwargs: parameters to pass to the aiohttp get function:
            auth: aiohttp.BasicAuth("", "")
            params: Dict[str, Any]
            headers: Dict[str, Any]

    """
    return asyncio.get_event_loop().run_until_complete(
        _get(url, aiohttp.ClientTimeout(timeout), **kwargs)
    )
remote_file='https://api.eumetsat.int/data/download/collections/EO%3AEUM%3ADAT%3AMSG%3AHRSEVIRI/products/MSG4-SEVI-MSG15-0100-NA-20210916121242.731000000Z-NA?access_token=43e1b232-02ed-30db-9d17-363f00a4a1f0'

注意:令牌将过期。

使用请求很好。但使用我自己的get函数会产生:

get(remote_file)
b'<am:fault xmlns:am="http://wso2.org/apimanager"><am:code>404</am:code><am:type>Status report</am:type><am:message>Runtime Error</am:message><am:description>No matching resource found for given API Request</am:description></am:fault>'

使用myget功能下载其他内容也很好。

那么有人知道为什么服务器在尝试异步访问时返回404吗?

我之前的问题被关闭了,因为你们中的一些人认为这是一个类似的问题:但是这个问题的原因是一个443 ssl认证错误。我仍然收到404如果我应用了一个附加的Connector,行为是相同的。

connector=aiohttp.TCPConnector(verify_ssl=False)
get(remote_file, connector=connector)

使用:python==3.9。7 aiohttp==3.7。4.

共有1个答案

公孙涵育
2023-03-14

原因是URL编码。为此,yarl可用于:

import yarl


remote_file = 'https://api.eumetsat.int/data/download/collections/EO%3AEUM%3ADAT%3AMSG%3AHRSEVIRI/products/MSG4-SEVI-MSG15-0100-NA-20210916121242.731000000Z-NA?access_token=43e1b232-02ed-30db-9d17-363f00a4a1f0'
remote_file_encoded = yarl.URL(remote_file, encoded=True)
 类似资料:
  • 每当我启动AWS代码构建时,每次都会出现这种类型的错误。请帮忙。 下载源失败3分钟2秒 收到https://github.com/themithunbiswas/test-repo.git/info/refs?service=git-上传包:拨打tcp 192.30。253.113:443:i/o超时

  • 这是我的问题。我正试图通过Asynctask使用download manager intent从服务器下载文件。在我的asynctask类的doInBackground中,我调用download manager intent,当下载完成(成功或失败)时,doInBackground将返回布尔值。这是我的密码 但DownloadManager状态永远不会跳到DownloadManager上。状态\u

  • 本文向大家介绍PHP下载大文件失败并限制下载速度的实例代码,包括了PHP下载大文件失败并限制下载速度的实例代码的使用技巧和注意事项,需要的朋友参考一下 1.问题: PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错; 2.原因: 这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出; 3.解决:分段下载,并限制下载速度; 总结 以上

  • 我正在使用Gradle构建工具,但我无法获得spark-core的源代码和文档。我已经搜索并申请了: 但它仍然不适合我。我想我缺少了一些东西,比如重建整个项目或下载这些片段。 我申请了<代码>。/gradlew cleanIdea idea也是如此。 当我尝试点击SparkConf.class上的命令并按下< code >下载源代码时,我得到< code > Sources not found f

  • 1.1.1. 下载源代码 1.1.1. 下载源代码 我们使用Google公司的Gerrit系统来管理我们的 RokidOS 源代码。 对外开放的 RokidOS 源代码,每天凌晨4点自动同步。 注册成为 Rokid 平台开发者 登录方式 登录 openai.rokid.com ,会统一跳转到 Rokid开发者网站 进行授权认证(如果是未注册用户,请先注册),登录后会跳转到 gerrit 页面,右上

  • 我正在创建一个PHP服务,用户可以从另一个服务器下载外部ZIP文件到具有PHP的服务器。下载后,我不断得到这个ZIP错误,说明文件已损坏/多部分。事实并非如此。我不能在linux服务器上提取它,但是当我将它复制到OSX机器上时,当我双击归档文件时,它可以完美地提取出来,但是terminal命令会产生同样的错误。我很困惑: 以下是文件(140MB)的链接: