繁体   English   中英

如何在 C# 中复制 Postman POST 请求

[英]How to replicate Postman POST request in C#

我对 .NET 的 HTTPClient 类相当陌生,因此如果我听起来像菜鸟,请原谅。 我正在尝试在 C# .Net 中复制 Postman 的 POST 请求并编写以下代码。 但是我没有得到任何回应,但 StatusCode: 404。有人可以帮助理解我哪里出错了吗?

另外我想了解,如何在以下代码中设置 Body 。

var httpClient = new HttpClient
{
   BaseAddress = new Uri("https://testURL.com"),
   Timeout = TimeSpan.FromMinutes(10)
};
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("audio/wav"));
httpClient.DefaultRequestHeaders.Add("Authorization", "Basic ldjfdljfdlfjdsjfdsl");

var content = new FormUrlEncodedContent(new[]
{
   new KeyValuePair<string, string>("model", "Test"),
});
var result = httpClient.PostAsync("api/v1/recognize", content).Result;

这是我在 Postman 中所做的并且它有效:

参数

身体

Postman 中的“参数”是指附加到 URL 的查询参数 您将看到 Postman 中的 URL 包含您在“参数”选项卡中添加的参数:

Postman URL 和查询参数

但是,这些似乎只是您输入的虚拟值,所以也许您不需要它们? 在任何情况下,向HttpClient请求添加查询参数的方式都有些不同,因为它需要添加到 URL 中。

之后,您还需要将音频文件作为内容添加到您的请求中。 目前,您将“Accept”标头设置为“audio/wav”,但您可能希望改为设置“Content-Type”标头(或者您是否也希望在响应中返回 WAV 文件?)。

据我所知,这就是你所缺少的:

using (var httpClient = new HttpClient())
{
    httpClient.Timeout = TimeSpan.FromMinutes(10);
    // Set request headers
    httpClient.DefaultRequestHeaders.Add("Authorization", "Basic ldjfdljfdlfjdsjfdsl");

    // Set query parameters
    var uriBuilder = new UriBuilder("https://testURL.com/api/v1/recognize");
    uriBuilder.Query = "model=Test";


    // Build request body
    // Read bytes from the file being uploaded
    var fileBytes = File.ReadAllBytes(wavFilePath);
    // Create request content with metadata/headers to tell the
    // backend which type of data (media type) is being uploaded
    var byteArrayContent = new ByteArrayContent(fileBytes);
    byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("audio/wav");
    // Wrap/encode the content as "multipart/form-data"
    // See example of how the output/request looks here:
    // https://dotnetfiddle.net/qDMwFh
    var requestContent = new MultipartFormDataContent
    {
        {byteArrayContent, "audio", "filename.wav"}
    };

    var response = await httpClient.PostAsync(uriBuilder.Uri, requestContent);
}

我当然没有针对您的应用程序测试过这个,但它应该是类似的。 可能是后端不需要“multipart/form-data”而只需要“audio/wav”。 我在您的 Postman 屏幕截图中看不到输出标题,但如果是这样,您可以直接使用byteArrayContent而不是将其包装在MultipartFormDataContent

注意:不要使用httpClient.PostAsync(...).Result 如果你想使用异步方法,你应该await它。 根据您的代码,如果您不小心,使用Result可能会给您带来问题。 并记得在使用后处理HttpClient (最简单的解决方案是使用using语句)。 如果您计划将HttpClient用于更多请求,则可以避免在完成之前处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM