Saya ingin mendapatkan kembali kode status tanggapan HTTP (misalnya 400, 401, 403, 503, dll) untuk kegagalan permintaan (dan idealnya juga untuk keberhasilan). Dalam kode ini, saya melakukan otentikasi pengguna dengan HTTP Basic dan ingin dapat mengirim pesan kepada pengguna bahwa otentikasi gagal ketika pengguna salah mengetikkan sandi mereka.
Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
.responseString { (req, res, data, error) in
if error != nil {
println("STRING Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for String")
}
.responseJSON { (req, res, data, error) in
if error != nil {
println("JSON Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for JSON")
}
Sayangnya, kesalahan yang dihasilkan tampaknya tidak menunjukkan bahwa kode status HTTP 409 benar-benar diterima:
STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:nil
Selain itu, alangkah baiknya untuk mengambil badan HTTP ketika terjadi kesalahan karena sisi server saya akan meletakkan deskripsi tekstual tentang kesalahan di sana.
Pertanyaan
Apakah mungkin untuk mengambil kode status setelah respon non-2xx?
Apakah mungkin untuk mengambil kode status tertentu setelah respons 2xx?
Apakah mungkin untuk mengambil isi HTTP setelah respons non-2xx?
Terima kasih!
Jawaban:
Untuk pengguna Swift 3.x / Swift 4.0 / Swift 5.0 dengan Alamofire> = 4.0 / Alamofire> = 5.0
Lebih banyak contoh verbose:
(Alamofire 4 berisi sistem kesalahan yang sama sekali baru, lihat di sini untuk detailnya)
Untuk pengguna Swift 2.x dengan Alamofire> = 3.0
sumber
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Jika Anda benar-benar ingin mendapatkan kesalahan respons HTTP, lebih baik bagi penggunaresponse.response?.statusCode
Dalam penangan penyelesaian dengan argumen di
response
bawah ini saya menemukan kode status http ada diresponse.response.statusCode
:sumber
sumber
Cara terbaik untuk mendapatkan kode status menggunakan alamofire.
sumber
Setelah
responseJSON
menyelesaikannya, Anda bisa mendapatkan kode status dari objek respons, yang memiliki tipeNSHTTPURLResponse?
:Ini akan berfungsi terlepas dari apakah kode status berada dalam kisaran kesalahan. Untuk informasi lebih lanjut, lihat dokumentasi NSHTTPURLResponse .
Untuk pertanyaan Anda yang lain, Anda bisa menggunakan
responseString
fungsi tersebut untuk mendapatkan isi respons mentah. Anda dapat menambahkan ini sebagai tambahanresponseJSON
dan keduanya akan dipanggil.sumber
Kesalahan Anda menunjukkan bahwa operasi dibatalkan karena alasan tertentu. Saya membutuhkan lebih banyak detail untuk memahami alasannya. Tapi saya pikir masalah yang lebih besar mungkin karena titik akhir Anda
https://host.com/a/path
palsu, tidak ada respons server nyata untuk dilaporkan, dan karenanya Anda melihatnyanil
.Jika Anda mencapai titik akhir valid yang memberikan respons yang tepat, Anda akan melihat nilai bukan-nil untuk
res
(menggunakan teknik yang disebutkan Sam) dalam bentukNSURLHTTPResponse
objek dengan properti sepertistatusCode
, dll.Juga, hanya untuk memperjelas,
error
adalah tipeNSError
. Ini memberi tahu Anda mengapa permintaan jaringan gagal. Kode status kegagalan di sisi server sebenarnya adalah bagian dari respons.Semoga itu bisa membantu menjawab pertanyaan utama Anda.
sumber
res
objeknya adalahnil
, jadi jawaban ini tidak membantu, maaf.error
mengacu pada tanggapan dengan kode status yang berada di luar kisaran yang kami sediakanvalidate()
. Terima kasih!!!Atau gunakan pencocokan pola
sumber
Anda dapat memeriksa kode berikut untuk penangan kode status oleh alamofire
jika kode status tidak divalidasi itu akan memasukkan kegagalan dalam kasus sakelar
sumber
Untuk pengguna Swift 2.0 dengan Alamofire> 2.0
sumber
Saya perlu tahu cara mendapatkan nomor kode kesalahan yang sebenarnya.
Saya mewarisi proyek dari orang lain dan saya harus mendapatkan kode kesalahan dari
.catch
klausa yang sebelumnya mereka siapkan untuk Alamofire:Atau jika Anda perlu mendapatkannya dari
response
nilai ikuti jawaban @ mbryzinskisumber