Misalkan saya memiliki variabel berikut:
System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
Bagaimana saya bisa memeriksa apakah ini adalah kode status sukses atau gagal?
Misalnya, saya dapat melakukan hal berikut:
int code = (int)status;
if(code >= 200 && code < 300) {
//Success
}
Saya juga dapat memiliki semacam daftar putih:
HttpStatusCode[] successStatus = new HttpStatusCode[] {
HttpStatusCode.OK,
HttpStatusCode.Created,
HttpStatusCode.Accepted,
HttpStatusCode.NonAuthoritativeInformation,
HttpStatusCode.NoContent,
HttpStatusCode.ResetContent,
HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
//Success
}
Tak satu pun dari alternatif ini meyakinkan saya, dan saya berharap untuk kelas atau metode .NET yang dapat melakukan pekerjaan ini untuk saya, seperti:
bool isSuccess = HttpUtilities.IsSuccess(status);
c#
.net
system.net
Matias Cicero
sumber
sumber
int code = (int)Response.StatusCode
dari sana, Anda perlu membuatEnum
cek sendiri di sini untuk contoh kerja stackoverflow.com/questions/1330856/…HttpClient
kelas?HttpResponseMessage
misalnyaHttpResponseMessage.IsSuccessStatusCode
(lihat jawaban saya) yang persis sama dengan pendekatan pertama Anda, dan menjadikannya metode ekstensi padaHttpStatusCode
tipe.Jawaban:
Jika Anda menggunakan
HttpClient
kelas, maka Anda akan mendapatkan keuntunganHttpResponseMessage
.Kelas ini memiliki properti berguna yang disebut
IsSuccessStatusCode
yang akan melakukan pemeriksaan untuk Anda.using (var client = new HttpClient()) { var response = await client.PostAsync(uri, content); if (response.IsSuccessStatusCode) { //... } }
Jika Anda penasaran, properti ini diimplementasikan sebagai:
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
Jadi, Anda dapat menggunakan kembali algoritme ini jika Anda tidak menggunakannya
HttpClient
secara langsung.Anda juga dapat menggunakan
EnsureSuccessStatusCode
untuk melempar pengecualian jika respons tidak berhasil.sumber
Kelas HttpResponseMessage memiliki properti IsSuccessStatusCode, melihat kode sumbernya seperti ini sehingga usr telah menyarankan 200-299 mungkin adalah yang terbaik yang dapat Anda lakukan.
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
sumber
Jawaban yang diterima sedikit mengganggu saya karena mengandung angka ajaib, (meskipun dalam standar) di bagian kedua. Dan bagian pertama tidak umum untuk kode status integer biasa, meskipun dekat dengan jawaban saya.
Anda dapat mencapai hasil yang persis sama dengan membuat instance HttpResponseMessage dengan kode status Anda dan memeriksa keberhasilan. Itu melempar pengecualian argumen jika nilainya lebih kecil dari nol atau lebih besar dari 999.
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode) { // ... }
Ini tidak terlalu ringkas, tetapi Anda dapat membuatnya menjadi ekstensi.
sumber
IsSuccessStatusCode
hebat, gunakan itu (seperti yang dikatakan jawaban yang diterima.) Jika tidak, jangan menambahkan cruft Anda sendiri dengan menggunakan abstraksi kecuali Anda melakukan pemeriksaan ini di semua tempatHttpResponseMessage
untuk menggunakan salah satu propertinya membutuhkan lebih banyak waktu daripada memeriksa dua kondisi logis denganint
.Menambahkan ke jawaban @TomDoesCode Jika Anda menggunakan HttpWebResponse, Anda dapat menambahkan metode ekstensi ini:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse) { return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299); }
sumber
Saya lebih memilih metode ekstensi yang dapat ditemukan.
public static class HttpStatusCodeExtensions { public static bool IsSuccessStatusCode(this HttpStatusCode statusCode) { var asInt = (int)statusCode; return asInt >= 200 && asInt <= 299; } }
Selama namespace Anda berada dalam cakupan, penggunaannya akan
statusCode.IsSuccessStatusCode()
.sumber
HttpStatusCode
cakupan? Ada banyak pustaka yang tidak menggunakan atau munculHttpResponseMessage
tetapi memberi Anda kode status.Itu tergantung pada sumber daya HTTP apa yang Anda panggil. Biasanya,
2xx
kisaran didefinisikan sebagai kisaran kode status sukses. Itu jelas merupakan konvensi yang tidak dipatuhi oleh setiap server HTTP.Misalnya, mengirimkan formulir di situs web sering kali akan menghasilkan pengalihan 302.
Jika Anda ingin merancang metode umum maka
code >= 200 && code < 300
idenya mungkin adalah pilihan terbaik Anda.Jika Anda memanggil server Anda sendiri maka Anda mungkin harus memastikan bahwa Anda melakukan standarisasi
200
.sumber
Ini adalah perpanjangan dari jawaban sebelumnya, yang menghindari pembuatan dan pengumpulan sampah berikutnya dari objek baru untuk setiap pemanggilan.
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); }
sumber