Bisakah kita membuat kode Status HTTP kustom?

92

Saya memiliki layanan REST dan WCF dan ingin mengirim kode status khusus berdasarkan operasi.

Contoh ketika beberapa validasi gagal maka saya ingin mengirim HTTP 444 dan ketika otorisasi gagal saya ingin mengirim HTTP 455

Pertanyaannya adalah bagaimana kita memvalidasinya untuk layanan web SOAP dan REST.

Pada klien bagaimana kode kesalahan bertindak karena ketika Anda mengirim HTTP 400/500 dari Layanan WCF (menggunakan SOAP) pengecualian dilemparkan pada klien yang menunjukkan kode status.

Sekarang jika saya mengirim kode status kustom baru, bagaimana cara klien menangani ini?

Rajesh
sumber
3
Apakah ini layanan yang Anda tunjukkan kepada dunia, atau apakah Anda juga mengontrol semua klien?
Rup

Jawaban:

109

Ya, selama Anda menghormati kelasnya - yaitu, 2xx untuk sukses, 4xx untuk kesalahan Klien, dll. Jadi, Anda dapat mengembalikan kode kesalahan 4XX khusus (lebih disukai yang belum ditetapkan) untuk kondisi kesalahan aplikasi Anda sendiri.

Mengutip dari [RFC 2616] [1]:

"Kode status HTTP dapat diperluas. Aplikasi HTTP tidak diharuskan untuk memahami arti dari semua kode status terdaftar, meskipun pemahaman seperti itu jelas diinginkan. Namun, aplikasi HARUS memahami kelas kode status apa pun, seperti yang ditunjukkan oleh digit pertama, dan memperlakukan setiap respons yang tidak dikenali setara dengan kode status x00 kelas itu, dengan pengecualian bahwa respons yang tidak dikenal HARUS TIDAK di-cache. Misalnya, jika kode status 431 yang tidak dikenal diterima oleh klien, klien dapat dengan aman berasumsi bahwa ada sesuatu yang salah dengan permintaannya dan perlakukan respons seolah-olah menerima kode status 400 ".

Kelas'

  • 1xx: Informasi - Permintaan diterima, proses berkelanjutan

  • 2xx: Sukses - Tindakan berhasil diterima, dipahami, dan diterima

  • 3xx: Pengalihan - Tindakan lebih lanjut harus diambil untuk menyelesaikan permintaan

  • 4xx: Kesalahan Klien - Permintaan berisi sintaks yang buruk atau tidak dapat dipenuhi

  • 5xx: Kesalahan Server - Server gagal memenuhi permintaan yang tampaknya valid [1]:

http://tools.ietf.org/html/rfc2616#section-6.1.1

ChrisNY
sumber
2
Jangan gunakan kode status tidak terdaftar, kecuali untuk pengujian.
Julian Reschke
1
ChrisNY: baik, jika Anda mengandalkan kode status tidak terdaftar dalam penggunaan HTTP, mungkin ada kerusakan jika orang lain menggunakan kode yang sama untuk tujuan yang berbeda. Jika Anda memerlukan informasi kesalahan yang lebih detail, Anda masih dapat menyematkannya di payload (lihat misalnya tools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke
21
@ChrisNY: Sebagian besar aplikasi web dirancang untuk bekerja dengan satu klien (kode javascript / ajax Anda) dan satu server (server Anda) sehingga menggunakan kode status khusus tidak masalah. Dalam situasi ini, bahkan tidak mungkin bagi 'orang lain' untuk menyebabkan 'kerusakan' dengan menggunakan kode status yang sama.
AR
2
Kutipan itu tidak mengatakan Anda dapat membuat kode Anda sendiri, itu mengatakan aplikasi Anda tidak perlu tahu apa setiap kode yang terdaftar selama itu menghormati kelas kode dan menimbulkan kesalahan untuk 4xx dll. Selain itu, satu-satunya masalah yang dapat saya lihat adalah bahwa di masa mendatang, salah satu kode ini ditetapkan secara resmi dan fungsi browser / javascript mungkin berubah. misalnya 494 serangan DDNS menghentikan semua komunikasi, browser mungkin melihatnya dan memblokir js agar tidak memulai komunikasi lagi ke ip tersebut. Sangat tidak mungkin tetapi Anda tidak bisa 100%, Twitter tampaknya menganggap tidak apa-apa untuk melakukan 420 Enhance Your Calm
Matt
1
Spesifikasi mengatakan Anda dapat membuat kode Anda sendiri, dan menggunakan kode 471 sebagai contoh. Dikatakan untuk mengasumsikan kesalahan 4xx yang tidak dikenal setara dengan 400.
Jeff Lowery
32

Saya menyarankan agar Anda tidak membuat kode status HTTP Anda sendiri, ketika kode yang berlaku sudah ada untuk hal-hal yang ingin Anda lakukan dalam contoh Anda.

Dari https://tools.ietf.org/html/rfc4918#section-11.2 :

Kode status 422 [Entitas Tidak Dapat Diproses] berarti server memahami jenis konten dari entitas permintaan (karenanya kode status 415 [Jenis Media yang Tidak Didukung] tidak sesuai), dan sintaks dari entitas permintaan benar (dengan demikian 400 [Permintaan Buruk ] kode status tidak sesuai) tetapi tidak dapat memproses instruksi yang ada. Misalnya, kondisi kesalahan ini dapat terjadi jika badan permintaan XML berisi instruksi XML yang dibentuk dengan baik (yaitu, benar secara sintaksis), tetapi salah secara semantik, instruksi XML.

Dapat dikatakan bahwa "tidak dapat memproses" bisa jadi karena kesalahan validasi.

Julian Reschke
sumber
10
Kegagalan otorisasi adalah 401, bukan 403. 403 dilarang, di mana otorisasi tidak akan menyelesaikan masalah.
Neil Hickman
6
401 adalah tentang otentikasi yang gagal (terlepas dari namanya).
Julian Reschke
1
401 adalah "Harap masuk (lagi)"
CodesInChaos
19

Ya, Anda dapat menambahkan kode kesalahan khusus. Jika memungkinkan, gunakan kode yang sudah ada, dan jika Anda mendeklarasikan yang baru, berhati-hatilah untuk menghindari benturan.

Anda harus sadar bahwa beberapa proxy memfilter kode yang tidak dikenal . Saya memiliki masalah dengan pengguna di mana di belakang proxy yang memetakan 5XX menjadi 500, dan 4XX ke 404. Ini membuat panggilan ajax saya di mana memeriksa kode status gagal.

fmsf
sumber
ya, proxy itu payah. Saya tidak tahu nama implementasi proxy, tetapi itu menafsirkan kode status khusus kami sendiri dan tidak mengirim tanggapan ke klien.
asgs
16

Beberapa aplikasi menambahkan kode respons kustomnya di kisaran 600-799. Periksa misalnya daftar kode respons dari KeyNote di sini

Kode Kesalahan yang Ditentukan Keynote (600-799)

600: CONNECTION ERROR - This indicates a general connection error
601: INCOMPLETE ERROR - This indicates sever sends an incomplete page/object (as indicated by Content-Length header)
602: UNEXPECTED CLOSE ERROR - This indicates socket connection has been closed unexpectedly
603: REFUSED ERROR - This indicates a request to connect to the server is refused
604: TIMEOUT ERROR - This indicates there is no activity in socket connection in 3 minutes
605: REDIRECT ERROR - This indicates an error in redirect HTTP header
606: SSL ERROR - This indicates a general error in SSL
607: HEADER ERROR - This indicates a malformed HTTP header
608: EMPTY RESPONSE ERROR - This indicates server doesn't send any response after a request is sent
609: UNKNOWN HOST ERROR - This indicates socket receives an unknown host error from DNS
610: NO ROUTE TO HOST ERROR - This indicates a no route to host error was received while attempting to open a socket
611: SOCKET ERROR - This indicates a general socket error
612: FRAME LOOP ERROR - This indicates a page has a frame loop (frame A includes Frame B that includes Frame A)
613: REDIRECT LOOP ERROR - This indicates a page has a redirect loop (page A redirects to page B that redirects to page A)
614: CONNECTION RESET ERROR - This indicates socket receive a reset signal from the server
615: SOCKET PROTOCOL ERROR - This indicates an error in socket protocol
616: SOCKET BIND ERROR - This indicates an error in binding the socket
617: CONNECTION ERROR - This indicates a general socket connection error
618: CHUNK ERROR - This indicates an error in chunked encoding
619: SSL TIMEOUT - This indicates a timeout during SSL handshake (2 minutes)
620: SSL END OF INPUT - This indicates an end-of-file is received during SSL handshake
621: SSL HANDSHAKE ERROR - This indicates a general error during SSL handshake
622: SSL CERTIFICATE ERROR - This indicates an error in SSL certificate verification
623: SSL AUTHENTICATION ERROR - This indicates an authentication error during SSL handshake
624: SSL BAD MAC ERROR - This indicates a bad MAC during SSL handshake
625: SSL CIPHER ERROR - This indicates a cipher error during SSL handshake
701: ERROR TEXT FOUND - This code is returned if any error text (such as, "Service Unavailable") are found in the main page (frame HTML contents included). Note that the error text must be defined in advance of the test. Error text means if the text is found, this session should be considered a failure.
702: REQUIRED TEXT NOT FOUND - This code is returned If not all required texts are found in the main page. Note that required text must be defined in advance of the test. Required text means if the text is not found, this session should be considered a failure.
703: HTML BODY EMPTY - This code is returned if the HTML body of the page is empty (only if error text or required text has been defined).

Apakah ini praktik yang baik, saya tidak akan berani mengatakannya, tetapi setidaknya ini adalah referensi yang menarik.

Melayu
sumber
1
Nilai tersebut ilegal, karena spesifikasi HTTP tidak mengizinkan apa pun di luar 100 ... 599.
Julian Reschke
16
@JulianReschke Saya bahkan menyebutkan bahwa saya "tidak berani mengatakan apakah ini praktik yang baik". Saya hanya menambahkan referensi tentang apa yang dilakukan aplikasi lain. Tidak memilih jawaban saya karena Keynote menggunakan kode status ilegal tampaknya tidak dapat dibenarkan. Saya hanya memberi makan diskusi.
Wilt
-12

Tidak, Anda hanya dapat menggunakan kode persyaratan dokumentasi rfc, lihat detailnya di RFC1945

Aimeast
sumber
4
Anda dapat menggunakan kode status apa pun yang ditentukan di iana.org/assignments/http-status-codes .
Julian Reschke
@ Julian, apakah ini berarti Rajesh dapat menggunakan yang "427-499 Belum ditetapkan" untuk tujuannya?
IrishChieftain
OK, kalau begitu :-) Anda dapat menggunakan kode status yang telah ditetapkan dari daftar itu. Atau Anda menulis spesifikasi untuk kode status baru dan mendaftarkannya.
Julian Reschke
5
Secara teknis, Anda dapat menggunakan apa pun yang Anda suka. Hanya saja, jangan berharap itu bermain baik dengan orang lain. Seperti yang ditanyakan dalam OP - jika Rajesh mengontrol semua klien, dia dapat membuat mereka mengerti "1337 - Semua basis Anda adalah milik kami" sesuka mereka. ;)
Cornelius
1
Anda menautkan ke kode status HTTP / 1.0, yang tidak digunakan sejak awal tahun 90-an.
andsens