2015-06-16 16 views
20

Próbuję wykonać następujące czynności zwijania (który pracuje dla mnie) w C# za pomocą HttpClient.Jak korzystać HttpClient do post z uwierzytelnianiem

curl -X POST http://www.somehosturl.com \ 
    -u <client-id>:<client-secret> \ 
    -d 'grant_type=password' \ 
    -d 'username=<email>' \ 
    -d 'password=<password>' \ 
    -d 'scope=all 

C# Kod:

HttpClientHandler handler = new HttpClientHandler { Credentials = new 
      System.Net.NetworkCredential ("my_client_id", "my_client_secret") 
    }; 


    try 
    { 
     using(var httpClient = new HttpClient(handler)) 
     { 
      var activationUrl = "www.somehosturl.com"; 

      var postData = "grant_type=password&[email protected]&password=mypass&scope=all"; 
      var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); 

      var response = await httpClient.PostAsync(activationUrl, content); 
      if(!response.IsSuccessStatusCode) 
       return null; 

      var result = await response.Content.ReadAsStringAsync(); 

      return result; 
     } 
    } 
    catch(Exception) 
    { 
     return null; 
    } 

Po wykonaniu po prostu zawiesza się, nie robi nawet złapać wyjątek

Normalnie jestem w stanie GET i POST perfekcyjnie, ale co jest rzucanie mnie jest jak ustawić auth rzeczy (ID klienta i klient tajne)

+2

Co masz na myśli przez awarie? Czy używasz tego w VS? Czy włączono wyjątki z pierwszej szansy? –

+0

Spójrz na ten post Stackoverflow, aby sprawdzić, czy to pomaga: http://stackoverflow.com/a/23914662/1337635 – joehanna

+0

Czy możesz wysłać swój kod, w tym podpis metody. –

Odpowiedz

14

Najpierw trzeba ustawić Authorization -Header ze swoimi <clientid> i <clientsecret>.

Zamiast StringContent należy użyć FormUrlEncodedContent jak pokazano poniżej:

var client = new HttpClient(); 
client.BaseAddress = new Uri("http://myserver"); 
var request = new HttpRequestMessage(HttpMethod.Post, "/path"); 

var byteArray = new UTF8Encoding().GetBytes("<clientid>:<clientsecret>"); 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 

var formData = new List<KeyValuePair<string, string>>(); 
formData.Add(new KeyValuePair<string, string>("grant_type", "password")); 
formData.Add(new KeyValuePair<string, string>("username", "<email>")); 
formData.Add(new KeyValuePair<string, string>("password", "<password>")); 
formData.Add(new KeyValuePair<string, string>("scope", "all")); 

request.Content = new FormUrlEncodedContent(formData); 
var response = await client.SendAsync(request); 
+2

Powinieneś wyjaśnić, * dlaczego * jest to odpowiedź na pytanie. Czy ty chcesz powiedzieć, że oprócz konieczności ustawienia nagłówka uwierzytelnienia, PO przekazuje dane pocztowe w niewłaściwy sposób? –

+0

Dzięki Alexander, to działa świetnie! Używam Xamarin, więc nie mogłem używać Encoding.ASCII, musiałem użyć nowego UTF8Encoding(). GetBytes(). – Jesse

+0

UTF8 ma sens. Zaktualizowałem swoją odpowiedź. –

13

spróbować umieścić swoje dane bezpośrednio do nieruchomości nagłówki HttpClient.

using (var client = new HttpClient()) { 
     var byteArray = Encoding.ASCII.GetBytes("my_client_id:my_client_secret"); 
     var header = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray)); 
     client.DefaultRequestHeaders.Authorization = header; 

     return await client.GetStringAsync(uri); 
} 
Powiązane problemy