Özel HTTP Durum kodları oluşturabilir miyiz?


92

Bir REST ve WCF hizmetim var ve işleme göre özel bir durum kodu göndermek istiyorum.

Bazı doğrulama başarısız olduğunda, HTTP 444 göndermek istiyorum ve yetkilendirme başarısız olduğunda HTTP 455 göndermek istiyorum

Soru, onu hem SOAP hem de REST web servisleri için nasıl doğrulatacağımızdır.

İstemcide hata kodu nasıl davranır, çünkü bir WCF Hizmetinden (SOAP kullanarak) HTTP 400/500 gönderdiğinizde, istemciye durum kodunu gösteren bir istisna atılır.

Şimdi, yeni bir özel durum kodu gönderirsem, istemci bunu nasıl halleder?


3
Bu dünyaya ifşa ettiğiniz bir hizmet mi yoksa tüm müşterileri de kontrol ediyor musunuz?
Rup

Yanıtlar:


109

Evet, sınıfa saygı duyduğunuz sürece - yani başarı için 2xx, İstemci hatası için 4xx, vb. Böylece, kendi uygulamanızın hata koşulları için özel 4XX hata kodlarını (tercihen atanmamış olanlar) döndürebilirsiniz.

[RFC 2616] [1] 'dan alıntı yapmak için:

"HTTP durum kodları genişletilebilir. HTTP uygulamalarının tüm kayıtlı durum kodlarının anlamını anlaması gerekmez, ancak böyle bir anlayış açıkça arzu edilir. Bununla birlikte, uygulamalar ilk basamakta belirtildiği gibi herhangi bir durum kodunun sınıfını anlamalı ve tanınmayan bir yanıtın önbelleğe alınmaması ZORUNLU olması dışında, o sınıfın x00 durum koduna eşdeğer olarak tanınmayan herhangi bir yanıt. Örneğin, istemci tarafından 431'in tanınmayan bir durum kodu alınırsa, isteğiyle ilgili yanlış bir şey ve yanıtı 400 durum kodu almış gibi davranın. "

Sınıf'

  • 1xx: Bilgilendirici - İstek alındı, işlem devam ediyor

  • 2xx: Başarı - Eylem başarıyla alındı, anlaşıldı ve kabul edildi

  • 3xx: Yönlendirme - İsteği tamamlamak için daha fazla işlem yapılmalıdır

  • 4xx: İstemci Hatası - İstek hatalı sözdizimi içeriyor veya yerine getirilemiyor

  • 5xx: Sunucu Hatası - Sunucu görünüşte geçerli bir isteği yerine getiremedi [1]:

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


2
Test haricinde kayıtlı olmayan durum kodlarını kullanmayın.
Julian Reschke

1
ChrisNY: HTTP kullanımınızda kayıtsız durum kodlarına güvenirseniz, başka biri aynı kodu farklı bir amaç için kullanırsa kırılma olabilir. Daha ayrıntılı hata bilgilerine ihtiyacınız varsa, bunu yine de yüke yerleştirebilirsiniz (örneğin, tools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke

21
@ChrisNY: Çoğu web uygulaması tek bir istemci (javascript / ajax kodunuz) ve tek bir sunucu (sunucunuz) ile çalışmak üzere tasarlanmıştır, bu nedenle özel bir durum kodu kullanmak tamamen iyidir. Bu durumlarda, 'başka birinin' aynı durum kodunu kullanarak 'kırılmaya' neden olması bile mümkün değildir.
AR

2
Bu alıntı kendi kodlarınızı oluşturabileceğinizi söylemiyor, uygulamanızın kod sınıfına saygı duyduğu ve bir 4xx için bir hata attığı sürece kayıtlı her kodun ne olduğunu bilmesine gerek olmadığını söylüyor. görebildiğim tek sorun, gelecekte bu kodlardan birinin resmi olarak atanması ve tarayıcı / javascript işlevselliğinin değişebileceğidir. örneğin, 494 DDNS saldırısı tüm iletişimi durdurur, tarayıcı bunu görebilir ve js'nin o ip ile daha fazla iletişim başlatmasını engelleyebilir. Pek olası değil ama% 100 olamazsın, Twitter 420 İyileştirin Sakinleştir
Matt

1
Spesifikasyon, kendi kodlarınızı oluşturabileceğinizi söylüyor ve örnek olarak 471 kodunu kullanıyor. Herhangi bir tanınmayan 4xx hatasını 400'e eşdeğer olarak varsaymak yazıyor.
Jeff Lowery

32

Örneğinizde yapmak istediğiniz şeyler için uygulanabilir kodlar zaten mevcutsa , kendi HTTP durum kodlarınızı oluşturmamanızı öneririm .

Gönderen https://tools.ietf.org/html/rfc4918#section-11.2 :

422 [Unprocessable Entity] durum kodu, sunucunun istek varlığının içerik türünü anladığı (dolayısıyla bir 415 [Unsupported Media Type] durum kodu uygun değildir) ve istek varlığının sözdiziminin doğru olduğu (dolayısıyla bir 400 [Bad Request ] durum kodu uygun değil) ancak içerdiği talimatları işleyemedi. Örneğin, bir XML istek gövdesi iyi biçimlendirilmiş (yani sözdizimsel olarak doğru), ancak anlamsal olarak hatalı XML talimatları içeriyorsa bu hata durumu oluşabilir.

"İşlenemiyor" un bir doğrulama hatası nedeniyle olabileceği tartışılabilir.


10
Yetkilendirme hatası 403 değil 401'dir. Yetkilendirmenin sorunu çözmeyeceği durumlarda 403 yasaktır.
Neil Hickman

6
401, başarısız kimlik doğrulaması hakkındadır (isme rağmen).
Julian Reschke

1
401 "Lütfen giriş yapın (tekrar)"
CodesInChaos

19

Evet, özel hata kodları ekleyebilirsiniz. Mümkünse zaten var olan kodları kullanın ve yenilerini beyan ediyorsanız, çarpışmalardan kaçınmaya dikkat edin.

Bazı proxy'lerin bilinmeyen kodları filtrelediğini bilmelisiniz . 5XX ile 500 ve 4XX ile 404'ü eşleyen proxy'lerin arkasında kullanıcılarla sorunlar yaşadım. Bu durum ajax çağrılarımın durum kodunu kontrol etmenin başarısız olmasına neden oldu.


evet, vekiller berbat. Proxy uygulama adını bilmiyorum, ancak özel bir durum kodunu kendi başına yorumladı ve yanıtı istemciye göndermedi.
asgs

16

Bazı uygulamalar, özel yanıt kodlarını 600-799 aralığına ekler. KeyNote'un yanıt kodu listesini buradan kontrol edin

Keynote Tanımlı Hata Kodları (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).

Bunun iyi bir uygulama olup olmadığını söylemeye cesaret edemem, ama en azından ilginç bir referans.


1
HTTP spesifikasyonunun 100 ... 599 dışında hiçbir şeye izin vermemesi nedeniyle bu değerler yasa dışıdır.
Julian Reschke

16
@JulianReschke "Bunun iyi bir uygulama olup olmadığını söylemeye cesaret edemediğimden" bile bahsetmiştim. Sadece diğer uygulamaların yaptıklarına bir referans ekliyorum. Cevabımı aşağı oylamak, çünkü Keynote yasadışı durum kodları kullanıyor gibi görünüyor. Ben sadece tartışmayı besliyorum.
Wilt


-12

Hayır, yalnızca rfc dokümantasyon gereksinimleri kodunu kullanabilirsiniz, RFC1945'teki ayrıntılara bakın


4
İana.org/assignments/http- status- codes içinde tanımlanan herhangi bir durum kodunu kullanabilirsiniz .
Julian Reschke

@Julian, bu Rajesh'in "427-499 Atanmamış" olanları kendi amaçları için kullanabileceği anlamına mı geliyor?
IrishChieftain

Tamam o zaman :-) Bu listeden herhangi bir atanmış durum kodunu kullanabilirsiniz . Veya yeni bir durum kodu için bir şartname yazıp kaydettirirsiniz.
Julian Reschke

5
Teknik olarak dilediğinizi kullanabilirsiniz. Sadece başkalarıyla iyi oynamasını beklemeyin. OP'de sorulduğu gibi - Rajesh tüm müşterileri kontrol ediyorsa, onlara "1337 - Tüm üssünüz bize ait" anlamalarını sağlayabilir. ;)
Cornelius

1
90'ların başından beri kullanılmayan HTTP / 1.0 durum kodlarına bağladınız.
andsens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.