下载从 REST API 响应接收的 zip 文件并将其保存到磁盘

Download and Save to disk a zip file received from a REST API response

提问人:maher kochbati 提问时间:11/1/2023 最后编辑:maher kochbati 更新时间:11/1/2023 访问量:71

问:

我正在制作一个 C# 脚本(.NET 应用程序)来使用 API 并从服务器检索数据(zip 文件),然后将下载的 zip 文件保存到临时目录中的磁盘中。

我可以通过单击“保存并下载”从 Postman 等 Rest 客户端下载 zip 文件,但我在使用我的 C# 脚本下载它并将其保存到磁盘时遇到了问题,

我尝试执行以下 C# 脚本,但它只检索 JSON 响应,当我将 Content-Type 更改为“application/zip”时,我收到错误 415 不支持的媒体类型

这是我的 C# 代码的一部分:

class Program
{

    static void Main(string[] args)
    {

   
        var tokenData = GetJson(tokenUrl, null, body);

        if(tokenData == null)
            Environment.Exit(0);

        //
        // Request document sets using OData
        // =========================
        string accessToken = tokenData.access_token;
        string odataUrl = innovatorUrl + "/server/odata/ACT_Document Set('D71DC18B35764C509F3565F511DFFF20')/act_reqtify_project_file/$value";

        var documentset = GetJson(odataUrl, accessToken);

        Console.WriteLine(documentset);

    }
    
    
    static dynamic GetJson( string url, string accessToken = null, HttpContent body = null )
    {
        using (HttpClient client = new HttpClient())
        {

            client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/zip") );

            if(accessToken != null)
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            }

            HttpResponseMessage response;
            if (body == null)
            {
                response = client.GetAsync(url).Result;
            }
            else
            {
                response = client.PostAsync(url, body).Result;
            }

            if (response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsAsync<dynamic>().Result;
            }
            else
            {
                Console.WriteLine("{0}: {1} ({2})", url, (int)response.StatusCode, response.ReasonPhrase);
                return null;
            }

        }
    }

    static string GetOAuthServerUrl( string url )
    {
        var discovery = GetJson(url);

        return discovery?.locations[0]?.uri;
    }

    static string GetTokenEndpoint(string url)
    {
        var configuration = GetJson(url);

        return configuration?.token_endpoint;
    }

}

问题:执行脚本时,收到以下错误 415(不支持的媒体类型):

在此处输入图像描述

需要:能够下载从 api 收到的 zip 文件并将其保存到磁盘

请问这个问题有什么帮助吗?

先谢谢你,

C# asp.net REST Postman zip

评论

0赞 Charlieface 11/1/2023
“我可以从 Postman 等 Rest 客户端下载 zip 文件”那么该请求是什么样子的,包括标头?旁注:与其使用,不如正确使用。.Resultawait

答:

0赞 Osama Shabrez 11/1/2023 #1

HTTP 415 不支持的媒体类型客户端错误响应代码表示服务器由于支持的有效负载格式而拒绝接受客户端请求。

您应该检查并匹配 postman 中存在的标头。此外,尝试将响应读取为字节数组。以下是您可以参考的快速代码片段:

using (HttpClient client = new HttpClient())
{
    HttpResponseMessage response = client.GetAsync(url).Result;
    if (response.IsSuccessStatusCode)
    {
        byte[] zipFileData = await response.Content.ReadAsByteArrayAsync();
        // Save the zip file to disk
        File.WriteAllBytes("output.zip", zipFileData);
    }
    else
    {
        Console.WriteLine("{0}: {1} ({2})", url, (int)response.StatusCode, response.ReasonPhrase);
        return null;
    }
}

评论

0赞 maher kochbati 11/1/2023
感谢您的帮助,我已经应用了您的解决方案,但我无法打开或解压缩保存的 zip 目录
0赞 Osama Shabrez 11/1/2023
您可以检查 zip 文件大小是否与您通过邮递员下载的大小匹配吗?
0赞 maher kochbati 11/2/2023
是的,当然,保存的 zip 文件的大小是 1Ko(我猜它是空的),但是从 postman 下载的文件大小是 200Ko,提取时约为 1Mo。
0赞 Osama Shabrez 11/2/2023
验证是否设置了正确的标头,以及是否正在等待下游内容完成下载