Chcę napisać wrapper do API, dzięki czemu będę mógł wykonywać różne akcje samymi żadaniami. W przypadku logowania trzeba wysłać 3 posty. Działa to tak, że przy wysyłaniu kolejnego używam dane, które uzyskałem w odpowiedzi poprzedniego.
Napisałem kod:
class SecureEndpoint : ISecureEndpoint
{
private const string rootUrl = "/secure/api";
private const string loginUrl = "/login";
private IRequester requester;
public SecureEndpoint(IRequester requester)
{
this.requester = requester;
}
public SubmitLoginResponse SubmitLogin(string login)
{
var content = new SubmitLoginContent(login).ToJson();
var response = requester.ExecutePostTaskAsync(rootUrl + loginUrl, content);
return JsonConvert.DeserializeObject<SubmitLoginResponse>(response.Content);
}
// other methods here..
}
public class ExampleApi : IApi
{
private ISecureEndpoint Secure { get; }
public ExampleApi()
{
var baseRequester = new RestClient("https://www.example.com");
baseRequester.AddDefaultHeader("X-Requested-With", "XMLHttpRequest");
baseRequester.CookieContainer = new CookieContainer();
baseRequester.FollowRedirects = false;
baseRequester.UserAgent = Static.StaticData.DEFAULT_USER_AGENT;
var ExampleRequester = new ExampleRequester(baseRequester);
Secure = new SecureEndpoint(ExampleRequester);
}
public BaseResponse Login(string login, string password)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
throw new ArgumentNullException("Brak danych logowania");
}
// send POST to /secure/api/login and pass content: {"data":{"username":"USER_LOGIN", "state":"login""}}
var submitLoginResponse = Secure.SubmitLogin(login);
// send POST to /secure/api/login and pass content: {"data":{"password":"USER_PASSWORD", "state":"password""},"sid":"SESSION_ID", "token":"TOKEN"}
var submitPasswordResponse = Secure.SubmitPassword(password, submitLoginResponse.Response.FlowId, submitLoginResponse.Session.Sid);
// send POST to /secure/api/login and pass content: {"data":{"username":"USER_LOGIN", "state":"login""},"sid":"SESSION_ID", "token":"TOKEN", "userToken":"USER_TOKEN"}
var submitDispatchResponse = Secure.SubmitDispatch(submitPasswordResponse.Response.FlowId, submitPasswordResponse.Session.Sid);
return new BaseResponse()
{
Ok = submitDispatchResponse.IsSuccessful
};
}
}
I w sumie działa. Wysyłam post na określony adres a odpowiedź JSON
parsuję na obiekt. Jednakże w trakcie pracy programu mogą wystąpić błędy:
-
Jeśli stracę połączenie z internetem podczas wysyłania żądania dostanę
NetworkException
-
Gdy strona zmieni adres url do json również dostanę
NetworkException
-
Jeśli strona zmieni odpowiedź json dostanę
JsonException
, gdyż deserializer nie poradzi sobie z parsowaniem tekstu na obiekt1
Dodatkowo nie sprawdzam submitLoginResponse.Response.Token
przed użyciem czy nie jest puste (no a token nigdy nie powinien być pusty). Czy w takim razie powinienem rzucić wyjątek, gdy w odpowiedzi dostanę np. pusty token, czy powinienem to zignorować i wysłać posta?