web-dev-qa-db-fra.com

Vérifier si HttpStatusCode représente un succès ou un échec

Supposons que j'ai la variable suivante:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

Comment puis-je vérifier s'il s'agit d'un code d'état de réussite ou d'échec?

Par exemple, je peux faire ce qui suit:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

Je peux aussi avoir une sorte de liste blanche:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}

Aucune de ces alternatives ne me convainc, et j'espérais une classe ou une méthode .NET capable de faire ce travail pour moi, telle que:

bool isSuccess = HttpUtilities.IsSuccess(status);
75
Matias Cicero

Si vous utilisez la classe HttpClient, vous aurez alors un retour HttpResponseMessage .

Cette classe a une propriété utile appelée IsSuccessStatusCode qui effectuera la vérification pour vous.

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}

Si vous êtes curieux, cette propriété est implémentée comme:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

Donc, vous pouvez simplement réutiliser cet algorithme si vous utilisez pas en utilisant HttpClient directement.

Vous pouvez également utiliser EnsureSuccessStatusCode pour générer une exception en cas d'échec de la réponse.

137
dcastro

La classe HttpResponseMessage a une propriété IsSuccessStatusCode. En regardant le code source, il ressemble à ceci. Usr a déjà suggéré que 200-299 est probablement le mieux que vous puissiez faire.

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
10
TomDoesCode

La réponse acceptée me dérange un peu car elle contient des nombres magiques (bien qu’ils soient en standard) dans sa deuxième partie. Et la première partie n’est pas générique, même si elle est proche de ma réponse.

Vous pouvez obtenir exactement le même résultat en instanciant HttpResponseMessage avec votre code de statut et en vérifiant son succès. Il lève une exception d'argument si la valeur est inférieure à zéro ou supérieure à 999.

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

Ce n'est pas exactement concis, mais vous pourriez en faire une extension.

8
user232548

Ajouter à la réponse @TomDoesCode Si vous utilisez HttpWebResponse, vous pouvez ajouter cette méthode d'extension:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}
6
ozba

Je suis partisan de la découvrabilité des méthodes d'extension.

public static class HttpStatusCodeExtensions
{
    public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
    {
        var asInt = (int)statusCode;
        return asInt >= 200 && asInt <= 299;
    }
}

Tant que votre espace de noms est dans la portée, l'utilisation serait statusCode.IsSuccessStatusCode().

4
bojingo

Cela dépend de la ressource HTTP que vous appelez. Habituellement, le 2xx gamme est définie comme la plage de codes d’état de réussite. C'est clairement une convention à laquelle tous les serveurs HTTP ne seront pas soumis.

Par exemple, l'envoi d'un formulaire sur un site Web renvoie souvent une redirection 302.

Si vous voulez concevoir une méthode générale, alors le code >= 200 && code < 300 idée est probablement votre meilleur coup.

Si vous appelez votre propre serveur, vous devrez probablement vous assurer que vous normalisez sur 200.

3
usr

C'est une extension de la réponse précédente, qui évite la création et le ramassage ultérieur d'un nouvel objet pour chaque appel.

public static class StatusCodeExtensions
{
    private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
    public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}
1
Rob Lyndon