Restsharp: ResponseStatus adalah Kesalahan saat respons 404 Tidak Ditemukan

Dibuat pada 21 Apr 2016  ·  7Komentar  ·  Sumber: restsharp/RestSharp

Gunakan RestClient.Execute(...) untuk melakukan GET yang menghasilkan 404.
IRestResponsyang kembali memiliki ResponseStatus = Error.
- Properti ErrorException memiliki pesan "String JSON tidak valid".
- Respons properti Data = null.

Lakukan permintaan yang sama dengan (non-generik) RestClient.Execute(...).
IRestResponse memiliki ResponseStatus = Complete

Saya tampaknya gagal untuk membatalkan deserialize respons ke dalam model yang diketik (TResult).
Dalam sumber daya API khusus ini mengembalikan badan Konten " " (karakter spasi tunggal), tidak yakin apakah itu harus benar-benar isi kosong.

Saya berharap ResponseStatus dalam kedua kasus akan Diselesaikan - permintaan berhasil, di sana tidak ada kesalahan transportasi.

accepted IMPORTANT investigate

Komentar yang paling membantu

Yang saya maksud dengan "non-generik" adalah metode Execute di RestClient yang tidak menggunakan parameter generik:

IRestResponse Execute(IRestRequest request);

melawan:

IRestResponse<T> Execute<T>(IRestRequest request) where T : new();

Jika itu membantu saya akhirnya mengatasi masalah ini dengan menulis metode ekstensi di IRestResponse yang menggunakan Json.NET untuk membatalkan serial properti Konten:

public static TResult Content<TResult>(this IRestResponse response)
{
    return JsonConvert.DeserializeObject<TResult>(response.Content);
}

Saya kemudian dapat menggunakan metode Execute "non-generik" untuk membuat permintaan saya dan mendapatkan respons yang diketik dengan metode ekstensi saya:

var resp = client.Execute(new RestRequest("some/resource"));

if (resp.ResponseStatus != ResponseStatus.Completed) { // Check whether request completed
     //Handle error
}

if (resp.StatusCode == HttStatusCode.NotFound) { // Check for 404
     //Handle 404
}

var result = resp.Content<SomeResult>();

Melakukan langkah yang sama dengan Jalankan "generik":

var resp = client.Execute<SomeResult>(new RestRequest("some/resource"));

if (resp.ResponseStatus != ResponseStatus.Completed) {
     //This is reached even for 404 - I presume because of a failure during deserialization
}

//Handling 404 here isn't possible be cause it appears the request did not complete...
if (resp.StatusCode == HttStatusCode.NotFound) {
    //Handle 404
}

var result = resp.Data; // Data is null

Semua 7 komentar

Saya telah menyiapkan Aplikasi Formulir Windows untuk diuji. Bisakah Anda memberikan detail lebih lanjut tentang masalah ini? Saya tidak yakin apa yang Anda maksud dengan "non-generik"

Yang saya maksud dengan "non-generik" adalah metode Execute di RestClient yang tidak menggunakan parameter generik:

IRestResponse Execute(IRestRequest request);

melawan:

IRestResponse<T> Execute<T>(IRestRequest request) where T : new();

Jika itu membantu saya akhirnya mengatasi masalah ini dengan menulis metode ekstensi di IRestResponse yang menggunakan Json.NET untuk membatalkan serial properti Konten:

public static TResult Content<TResult>(this IRestResponse response)
{
    return JsonConvert.DeserializeObject<TResult>(response.Content);
}

Saya kemudian dapat menggunakan metode Execute "non-generik" untuk membuat permintaan saya dan mendapatkan respons yang diketik dengan metode ekstensi saya:

var resp = client.Execute(new RestRequest("some/resource"));

if (resp.ResponseStatus != ResponseStatus.Completed) { // Check whether request completed
     //Handle error
}

if (resp.StatusCode == HttStatusCode.NotFound) { // Check for 404
     //Handle 404
}

var result = resp.Content<SomeResult>();

Melakukan langkah yang sama dengan Jalankan "generik":

var resp = client.Execute<SomeResult>(new RestRequest("some/resource"));

if (resp.ResponseStatus != ResponseStatus.Completed) {
     //This is reached even for 404 - I presume because of a failure during deserialization
}

//Handling 404 here isn't possible be cause it appears the request did not complete...
if (resp.StatusCode == HttStatusCode.NotFound) {
    //Handle 404
}

var result = resp.Data; // Data is null

Saya mendapatkan masalah yang sama menggunakan v105.2.3, jadi telah mengubah panggilan Execute<> saya menjadi Execute dan menggunakan saran di atas yang telah menyelesaikan masalah.

Masalahnya tampaknya karena konten dari server untuk respons HTTP 500 menjadi potongan HTML, yang tidak dapat di-deserialized ke dalam tipe saya menggunakan serializer JSON dan oleh karena itu saya menduga ResponseStatus diatur ke Error sebagai deserialisasi gagal.

Dokumentasi saat ini menunjukkan bahwa ResponseStatus hanya disetel untuk kesalahan terkait jaringan/konektivitas, dan bukan kesalahan deserialisasi.

Untuk apa nilainya, proposal saya adalah bahwa properti Data melempar pengecualian jika deserialisasi gagal, daripada mengubah ResponseStatus dari Selesai menjadi Kesalahan (walaupun ini mungkin merupakan perubahan besar bagi mereka yang mengharapkannya berfungsi seperti saat ini).

Masih buka? Apakah ini akan kemana-mana? Sepertinya itu harus ditangani atau dikomentari & ditutup sekarang.

Saya pikir itu harus diperbaiki. Saran dari @simonob terdengar sangat masuk akal. Banyak aplikasi mengembalikan respons buruk yang tidak dapat kami deserialise, ini cukup normal.

Ok, itu sebenarnya dengan desain. Saya menambahkan opsi untuk kembali Selesai ketika deserialisasi gagal. Untuk kompatibilitas mundur, saya harus menjaga perilaku saat ini apa adanya, tetapi jika Anda menyetel RestClient.FailOnDeserializationError ke false di versi berikutnya, Anda akan mengurutkannya.

Karena penasaran, apa alasan untuk pergi dengan perilaku ini?
Bagi saya, sepertinya perilaku paling logis dalam kasus di mana permintaan berhasil diselesaikan dan menerima kode status dari server, tetapi gagal untuk di-deserialized secara lokal, adalah membuat IsSuccessful menjadi false dan ResponseStatus = Completed.

Cara saat ini, sejauh yang saya tahu tidak ada cara untuk mengetahui dari melihat salah satu dari properti tersebut, apakah permintaan gagal mendapatkan respons dari server, atau berhasil diselesaikan tetapi gagal untuk deserialize. Mereka pada dasarnya keduanya tampaknya menunjukkan hal yang sama, membuat salah satunya menjadi mubazir.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ChenJasonGit picture ChenJasonGit  ·  5Komentar

stricq picture stricq  ·  6Komentar

vDeggial picture vDeggial  ·  6Komentar

AlexanderSchoenfeld picture AlexanderSchoenfeld  ·  3Komentar

thomasd3 picture thomasd3  ·  5Komentar