【问题标题】:How do you make a Post request with binary file in this situation?在这种情况下,如何使用二进制文件发出 Post 请求?
【发布时间】:2020-10-13 17:43:58
【问题描述】:

我有系统 A(供人们上传文件的 Web 界面)和系统 B(文件归档系统)。

步骤 1) 用户通过 System A 提交文件

步骤 2) 系统 A 接收文件,并对其进行加密

步骤 3) 系统 A 通过调用系统 B 的端点 (http://127.0.0.1:8080/rest/bookstore/) 发送带有解密文件的 Post 请求。

步骤 4) 系统 B 收到 POST 请求。然后归档文件。

此时,我卡在第 3 步。我能够接收文件,但是当系统 A 使用该文件发出发布请求时抛出异常

我正在尝试将 csv 文件发布到 http://127.0.0.1:8080/rest/bookstore/。但是它返回

  •   RestSharp.RestClient.Execute returned   "StatusCode: NotAcceptable, Content-Type: , Content-Length: 0)" RestSharp.RestResponse
    

你知道下面的代码有什么问题吗?

string path = "THE PATH OF THE FILE";
byte[] file = System.IO.File.ReadAllBytes(path);
string filevalue = System.Convert.ToBase64String(file);

var client = new RestClient("http://127.0.0.1:8080/rest/bookstore/");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "text/csv");
request.AddParameter("text/csv", file , ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

【问题讨论】:

  • 我有点困惑,你有一个ValuesController 需要一个 id 但你不使用它而是尝试重定向到另一个控制器以返回一个 .csv? .csv 将以 JSON 或 XML 形式返回 - 否则您只需下载该文件,以便它在浏览器中返回。
  • 嗨,格雷格。很抱歉让你感到困惑。在我的情况下。控制器将从 view 接收文件,并将其放在文件夹中。然后我会将其重定向到我的另一个应用程序127.0.0.1:8080/rest/bookstore。我被困在发帖请求中。我已经在 Postman 中模拟了这个过程,那里没有问题。这就是为什么我怀疑我是否错过了代码中的某些内容。

标签: c# postman restsharp


【解决方案1】:

今天我检查了系统日志。我找到了这条消息(这意味着我的文件已存档)。

INFO 11:15:01.938 (FedoraLdp) 获取资源“书店/cc51bc52-e59a-4e29-801a-e7d979326197”

所以我尝试提交发布请求并检查文件是否已存档。 最后发现该文件已存档,如系统日志中所示。即使,在 Http Post 响应中,它说我的请求是不可接受的......

所以我认为 API 端点没有返回我正确的消息,也没有给我明确的信息,说明我提出的 Http Post 请求中缺少什么。

【讨论】:

    【解决方案2】:

    你应该不需要重定向,应该只是:

    public class BookstoreController : ApiController
    {
         public void Get() => Download();
    }
    
    public static void Download()
    {
         var client = new RestClient("...");
         var request = new RestRequest("...", Method.POST);
         var response = client.Execute(request);
         client.DownloadData(new RestRequest("/file", Method.GET)).SaveAs("filename.csv");
         
         Console.WriteLine("Output: ");
         Console.WriteLine(response.Content);
    }
    

    本质上,您可以执行方法内容来下载文件。但是创建客户端和请求,然后执行响应,但将请求中的数据下载到响应中。然后它应该强制浏览器为用户下载文件。

    【讨论】:

    • 嗨,格雷格。谢谢您的解决方案。很好。我会告诉你更多关于流程的信息。我有系统 A(供人们上传文件的 Web 界面)和系统 B(文件存档系统)。 1)用户通过系统 A 提交文件 2)系统 A 接收文件,并对其进行加密 3)系统 A 将通过调用系统 B 的端点发送带有解密文件的 Post 请求 4)系统 B 接收 POST 请求。然后归档文件。此时,我被困在第 3 步。我能够接收文件,但是当系统 A 使用文件发出发布请求时抛出异常。
    • 嗨,格雷格。我已经更新了我的代码。我认为我没有清楚地说明我的问题。
    • 所以不能存档到服务器,失败了?它到底说了什么?
    • 嗨,格雷格。谢谢你 。我的问题解决了。我检查了系统
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多