Die Umwandlung der Inhalte von HttpResponseMessage zum Objekt

Meine Frage: Wie mache ich das?

So, ich hatte mich nicht berührt, nichts .Netto in etwa 6 Jahre, bis diese Woche. Es gibt eine Menge, die ich vergessen habe und noch mehr, dass ich nie wusste, und während ich Liebe die Idee der async/await-Schlüsselwörter, ich habe da ein kleines problem die Umsetzung der folgenden Anforderungen für eine client-API-Implementierung:

  1. Die ServerAPI Klasse hat eine Methode für jede der API-Methoden, wobei die entsprechenden Eingabeparameter (z.B. die Methode Login nimmt in einem id und ein password macht den API-Aufruf und gibt das Ergebnis an den Aufrufer).
  2. Ich möchte abstrahieren das JSON so, dass mein API-Methoden liefern den aktuellen Objekts, das Sie abrufen (z.B. die Login oben genannte Methode gibt eine User Objekt mit dem auth-token, uid, etc.)
  3. Einige API-Methoden liefern eine 204 auf Erfolg oder die keinen sinnvollen Inhalt haben (nicht sinnvoll in meinem Anwendungsfall habe ich vielleicht nur die Sorge über Erfolg/Misserfolg), für diese würde ich gerne wieder entweder ein bool (true = Erfolg) oder das status-code.
  4. Ich möchte zu halten das async/await (oder gleichwertig) design, denn es scheint wirklich zu funktionieren gut so weit.
  5. Für einige Methoden, ich muss vielleicht einfach nur wieder die HttpResponseMessage Objekt und lassen Sie die Anrufer beschäftigen.

Das ist ungefähr das, was ich habe, so weit und ich bin nicht sicher, wie man es konform mit den oben genannten, ODER ob ich sogar dieses Recht. Jede Beratung wird geschätzt (flamen, jedoch ist es nicht).

//200 (+User JSON) = success, otherwise APIError JSON
internal async Task<User> Login (string id, string password)
{
    LoginPayload payload = new LoginPayload() { LoginId = id, Password = password};
    var request = NewRequest(HttpMethod.Post, "login");
    JsonPayload<LoginPayload>(payload, ref request);

    return await Execute<Account>(request, false);
}

//204: success, anything else failure
internal async Task<Boolean> LogOut ()
{
    return await Execute<Boolean>(NewRequest(HttpMethod.Delete, "login"), true);
}

internal async Task<HttpResponseMessage> GetRawResponse ()
{
    return await Execute<HttpResponseMessage>(NewRequest(HttpMethod.Get, "raw/something"), true);
}

internal async Task<Int32> GetMeStatusCode ()
{
    return await Execute<Int32>(NewRequest(HttpMethod.Get, "some/intstatus"), true);
}

private async Task<RESULT> Execute<RESULT>(HttpRequestMessage request, bool authenticate)
{
    if (authenticate)
        AuthenticateRequest(ref request); //add auth token to request

    var tcs = new TaskCompletionSource<RESULT>();
    var response = await client.SendAsync(request);     

    //TODO: If the RESULT is just HTTPResponseMessage, the rest is unnecessary        

    if (response.IsSuccessStatusCode)
    {
        try
        {
            //TryParse needs to handle Boolean differently than other types
            RESULT result = await TryParse<RESULT>(response);
            tcs.SetResult(result);
        }
        catch (Exception e)
        {
            tcs.SetException(e);
        }

    }
    else
    {
        try
        {
            APIError error = await TryParse<APIError>(response);
            tcs.SetException(new APIException(error));
        }
        catch (Exception e)
        {
            tcs.SetException(new APIException("Unknown error"));
        }
    }

    return tcs.Task.Result;
}

Dies ist die APIError JSON-Struktur (es ist der status-code + ein benutzerdefinierter Fehler-code).

{
  "status": 404,
  "code":216,
  "msg":"User not found"
}

Ich würde lieber bleiben mit System.Net, aber das ist hauptsächlich, weil ich die nicht wechseln wollen, alle meine code über. Wenn das, was ich möchte, ist es einfacher, auf andere Weise getan, dann ist es offensichtlich lohnt sich die zusätzliche Arbeit.

Dank.

Meine Frage: Wie mache ich das? ich würde sagen, dass ein Code Überprüfen ist für code, den Sie erwägen, komplett not-code, den Sie nicht wissen, wie Sie zu vervollständigen.
Versuchen Sie suchen in der [JsonProperty("myPropertyName")], es könnte Ihnen helfen.
Also, meinst du, dass Sie bereits getan haben, die ganze UWP-Projekt getestet und es funktioniert gut, aber möchte wissen, ob dieser code ist den oben genannten Anforderungen ,und wenn Sie jemand wissen, der bessere Weg zur Umsetzung dieser Anforderungen?
Ich habe es teilweise funktioniert: Login funktioniert, weil es gibt ein Objekt zurück, aber Logout schlägt immer fehl, weil es versucht zu analysieren, den Inhalt einer 204 (NoContent) und es ist nichts da (ich möchte dies wieder true/false). Also ich brauche Hilfe bei der Rückkehr Int32 oder HttpResponseMessage je nach Typ. Ich könnte immer 3 verschiedene execute Methoden, und nennen Sie Sie entsprechend an, wenn ich muss, aber wie es scheint, fehlt mir ein kleines bisschen hier. Ein Stoß in die richtige Richtung.
Entsprechend Ihrer Idee, so scheint es code wie if (RESULT IS HttpResponseMessage)if(RESULT IS Boolen)if(!(RESULT is ValueType)) ist der einzige Weg für Ihre Anforderungen. Aber ich empfehle Sie nicht zu benutzen, die obigen code. Andere Funktionen haben separate execute-Methode, wie Sie denken ist der bessere Weg. Der code sieht aus wie ein wenig viel bedeutet nicht ein schlechtes design, ekelhaft, wie der code oben, setzen Sie die execute-Logik alles in einem, erhöhen die Kupplung. Zum Beispiel, wenn Sie nur wollen, ändern Sie die Logik der Abmeldung, sollten Sie aktualisieren nur die execute-Methode, versehentlich berührt die Login-Funktion.

InformationsquelleAutor copolii | 2016-03-23

Schreibe einen Kommentar