2015-06-16 3 views
20

Ich versuche, die folgende Locke (die für mich funktioniert) in C# mit HttpClient.Wie verwende ich HttpClient zum Posten mit Authentifizierung

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 

Der C# Code:

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; 
    } 

Wenn er ausgeführt wird, nur stürzt heraus, nicht sogar die Ausnahme abfangen

Ich bin in der Lage zu GET und POST völlig in Ordnung Normalerweise, aber was mir Abwerfen ist, wie die Auth Stuff (Client-ID und Client-Secret)

+2

Was meinst du abstürzt? Führst du das in VS? Haben Sie Ausnahmen für die erste Chance aktiviert? –

+0

Werfen Sie einen Blick auf diesen Stackoverflow Beitrag, um zu sehen, ob es hilft: http://Stackoverflow.com/a/23914662/1337635 – joehanna

+0

könnten Sie bitte Ihren Code einschließlich Methodensignatur posten. –

Antwort

14

Zuerst müssen Sie die Authorization -Header gesetzt mit Ihrem <clientid> und <clientsecret>.

Statt StringContent der Verwendung sollten Sie FormUrlEncodedContent wie unten dargestellt:

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

Du solltest erklären * why * das ist eine Antwort auf die Frage. Machst du Möchten Sie sagen, dass das OP die Postdaten nicht falsch übergibt, obwohl es den Authentifizierungsheader setzen muss? –

+0

Danke Alexander, das funktioniert super! Ich benutze Xamarin obwohl ich konnte nicht verwenden Encoding.ASCII, ich musste neue UTF8Encoding(). GetBytes() verwenden. – Jesse

+0

UTF8 macht Sinn. Ich habe meine Antwort aktualisiert. –

13

Setzen Sie Ihre Anmeldeinformationen direkt in die Header-Eigenschaft von 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); 
} 
Verwandte Themen