2017-04-12 151 views
2

我有一个看起来像这样的卷曲要求:如何转换卷曲请求HttpClient的

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?

+3

为什么你不设置'Credentials'属性,而不是试图构造认证头? –

+0

我是C#和HttpClient的新手,所以这就是我在互联网上的贡献,并试图构建自己的其他问题和示例,并试图了解它如何工作以及转换我的curl请求的正确方法。所以,这只是我的尝试,我打开所有的建议找到最佳的解决方案。 – Sonja

回答

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); 
} 
+0

你不应该有'async void'。这是一个可怕的想法。让它返回一个任务。 http://tomasp.net/blog/csharp-async-gotchas.aspx/ – mason

+0

谢谢你的信息。其实我在应用程序中使用了任务,只是忘了在答案中纠正它,因为我从问题中复制了这部分代码。现在我纠正了答案。 – Sonja

+0

另外,像这样创建HttpClient实例可能会很危险。请参阅[您正在使用HttpClient错误,它会破坏您的软件](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)。我个人避免使用HttpClient,并发现[RestSharp](http://restsharp.org/)是一个更容易使用的工具。 – mason