Voorheen heb je altijd data opgevraagd met 'GET'. Nu moet je bepaalde data naar een uri posten met 'POST'.
De httpclient heeft een method; 'PostAsync' die een uri neemt en een content. De content is een HttpFormUrlEncodedContent class met de parameters die je normaal in de textbox invult.
Met de response die de PostAsync returned kun je de statuscode kijken van je response. (OK, FORBIDDEN, UNAUTHORIZED etc)
Nadat je een response hebt kun je uit de filter die in de constructor met de httpclient meegaat de cookies halen. Deze moet je daarna altijd met je requests (in de filter.CookieManager) meegeven zodat de client weet dat je ingelogd bent. Deze moet je dus ook ergens opslaan in je programma.
Ik kan niet veel testen bij deze website omdat ik geen juiste inlog gegevens heb maar kan wel een stukje voorbeeld code geven van iets dat ik zelf gebruik.
(code gewijzigd voor voorbeeld)
Om wat gegevens op te slaan heb ik een 'Account' class. Username kun je gebruiken om aan te geven hoe de gebruiker is aangemeld en de cookies heb je nodig bij elke keer dat je data van een website wilt halen.
[CPP]public class Account
{
private readonly string _username;
private readonly HttpCookieCollection _cookies;
public Account(string username, HttpCookieCollection cookies)
{
_username = username;
_cookies = cookies;
}
public string Username
{
get { return _username; }
}
public HttpCookieCollection Cookies
{
get { return _cookies; }
}
public override string ToString()
{
var sb = new StringBuilder();
sb.AppendLine(string.Format("username:{0}", Username));
foreach (var cookie in Cookies)
{
sb.AppendLine(string.Format("\t{0}:{1}", cookie.Name, cookie.Value));
}
return sb.ToString();
}
}[/CPP]
En om in te loggen heb ik een 'AuthenticationService' class (ook voorbeeld code)
[CPP]public class AuthenticationService
{
private readonly Uri _baseUri = new Uri("https://www.somtoday.nl");
private readonly Uri _authUri = new Uri("https://www.somtoday.nl/willibrord/login");
public async Task<Account> Authenticate(string username, string password)
{
using (var filter = new HttpBaseProtocolFilter())
using (var client = new HttpClient(filter))
{
//%3Asubmit=x&username=user&password_1402487292712=pass
var parameters = new Dictionary<string, string>
{
{"%3Asubmit", "x"},
{"username", username},
{"password_1402487292712", password},
};
var content = new HttpFormUrlEncodedContent(parameters);
var postUri = new Uri("https://www.somtoday.nl/willibrord/login");
using (var response = await client.PostAsync(postUri, content))
{
Debug.WriteLine("the statuscode from the response is '{0}'", response.StatusCode);
if (response.StatusCode == HttpStatusCode.Ok)
{
var cookieCollection = filter.CookieManager.GetCookies(_baseUri);
return new Account(username, cookieCollection);
}
}
}
return null;
}
}[/CPP]
In je browser (of sniffer zoals wireshark) als je je netwerk verkeer volgt (dev tools, ongeveer zoals je de html elements kunt bekijken) kun je data zien als je inlogt daar vandaan komen de namen van de parameters, de url van de post etc
In de account class kun je later ook andere gegevens toevoegen over het account zoals dingen in het profiel (geb. datum, woonplaats etc)