【问题标题】:How to convert curl request to HttpClient如何将 curl 请求转换为 HttpClient
【发布时间】:2017-04-12 15:32:22
【问题描述】:

我有一个如下所示的 curl 请求:

curl -i -XPOST 'http://my_url:port/write?db=myDb' -u user:xxxxx --data-binary 'FieldName,host=M.233 value=52.666 timestamp'

我正在尝试使用 HttpClient 发布此请求。我不确定我应该如何称呼它。这是我试图做的:

public async void  TestHttpClient()
{ 
    var client = new HttpClient();
    var credentials = Encoding.ASCII.GetBytes("user:xxxxx");
    var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials));
    client.DefaultRequestHeaders.Authorization = header;
    client.BaseAddress = new Uri("http://my_url:port/write?db=myDb");
    var result = await client.PostAsync(..);
}

我应该为 PostAsync() 编写哪些参数?

如何将--data-binaryFieldName,host=M.233 value=52.666 timestamp从curl转换为HttpClient?

【问题讨论】:

  • 为什么不直接设置Credentials 属性而不是尝试构造身份验证标头?
  • 我是 C# 和 HttpClient 的新手,所以这是我在互联网上找到的,并试图建立自己的寻找其他问题和示例并试图了解它的工作原理以及正确的方法转换我的 curl 请求。因此,这只是我的尝试,我愿意接受所有建议以找到最佳解决方案。

标签: c# .net curl dotnet-httpclient asynchttpclient


【解决方案1】:

我的解决方案是:

public async Task TestHttpClient()
{ 
    var client = new HttpClient();
    var credentials = Encoding.ASCII.GetBytes("user:xxxxx");
    var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials));
    client.DefaultRequestHeaders.Authorization = header;
    String url = "http://my_url:port/write?db=myDb";
    String content = "FieldName,host=M.233 value=52.666 timestamp";
    StringContent stringContent = new StringContent(content);
    var result = await client.PostAsync(url, stringContent);
}

【讨论】:

【解决方案2】:

有一个可爱的 curl 到 c# 转换器,它可以使用 HTTPClient 将你的 curl 脚本转换为 C# 代码。 https://curl.olsh.me/

使用此工具和您的 curl 脚本,我们得到以下结果。

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("POST"), "http://http//my_url:port/write?db=myDb"))
    {
        var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("user:xxxxx"));
        request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}"); 

        request.Content = new StringContent("FieldName,host=M.233 value=52.666 timestamp");
        request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); 

        var response = await httpClient.SendAsync(request);
    }
}

【讨论】:

    【解决方案3】:

    要通过 --data-binary 标志,我必须将 Content-Transfer-Encoding 添加到请求内容标头,请参见以下示例:

    卷曲:

    curl -v -X POST \
        -H "Authorization: Bearer token" \
        --header "Content-Type: application/json" \
        --data-binary "@example.json" \
        https://example.com/data
    

    C#:

    using var httpClient = new HttpClient
    {
        BaseAddress = "https://example.com/"
    };
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    const string Uri = "data";
    var stringContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); // In case data is json (ex: --header "Content-Type: application/json"):
    stringContent.Headers.Add("Content-Transfer-Encoding", "binary"); // For data-binary flag: --data-binary "@example.json"
    var request = new HttpRequestMessage(HttpMethod.Post, Uri) { Content = stringContent };
    var response = await httpClient.SendAsync(request, cancellationToken);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2019-06-28
      • 1970-01-01
      • 2018-01-30
      • 2023-02-14
      • 2020-01-26
      • 2019-08-17
      相关资源
      最近更新 更多