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?