2017-04-12 1 views
2

J'ai une demande boucle qui ressemble à ceci:Comment convertir la demande boucle à HttpClient

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

Je suis en train de poster cette demande en utilisant HttpClient. Je ne sais pas exactement comment je devrais l'appeler. C'est ce que j'ai essayé de faire:

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(..); 
} 

Quels paramètres dois-je écrire pour PostAsync()?

Comment faire pour convertir --data-binary et FieldName,host=M.233 value=52.666 timestamp de curl à HttpClient?

+3

Pourquoi ne vous posez pas simplement la propriété 'credentials' au lieu d'essayer de construire les en-têtes d'authentification? –

+0

Je suis nouveau en C# et HttpClient donc c'est ce que j'ai trouvé sur internet et j'ai essayé de construire mon propre à d'autres questions et exemples et d'essayer de comprendre comment ça marche et quelle est la bonne façon de convertir ma requête. Comme c'est juste mon essai, je suis ouvert à toutes les suggestions pour trouver la meilleure solution. – Sonja

Répondre

1

La solution pour moi était:

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

Vous ne devriez pas avoir 'async void'. C'est une idée terrible. Avoir renvoyé une tâche à la place. http://tomasp.net/blog/csharp-async-gotchas.aspx/ – mason

+0

Merci pour l'info. En fait, j'ai utilisé la tâche dans l'application, j'ai juste oublié de corriger ici dans la réponse que j'ai copié cette partie du code de la question. Maintenant j'ai corrigé la réponse. – Sonja

+0

De même, créer des instances HttpClient comme ça peut être dangereux. Voir [Vous utilisez incorrect HttpClient et il déstabilise votre logiciel] (https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/). J'évite personnellement d'utiliser HttpClient et j'ai trouvé que [RestSharp] (http://restsharp.org/) était un outil beaucoup plus facile à utiliser. – mason