รหัสสถานะ http สำหรับข้อผิดพลาด“ บริการไม่พร้อมให้บริการในพื้นที่ของคุณ” ควรเป็นอย่างไร


51

บริการของเราอยู่ใน 5 เมืองในขณะนี้ หากมีคนพยายามโทรหา API บริการของเราจากเมืองอื่นเราต้องการส่งข้อผิดพลาดService not available in your areaนี้

คำถามคือรหัส http ที่เหมาะสมสำหรับข้อผิดพลาดนี้คืออะไร?

  • 503: บริการไม่พร้อมใช้งาน
  • 403: ถูกห้าม

หรืออย่างอื่น?


52
"ถ้ามีคนพยายามโทรหา API บริการของเราจากเมืองอื่น" โปรดทราบว่าการระบุตำแหน่งทางภูมิศาสตร์ IP มักจะผิดมากหากคุณห้ามผู้ใช้ที่มีตำแหน่งทางภูมิศาสตร์ IP ไปยังเมืองอื่นคุณอาจถูกล็อคผู้ใช้ที่ถูกกฎหมาย
ปีเตอร์กรีน

43
ฉันไม่ได้รับอนุญาตให้ขับรถสำหรับลูกของฉันใครอยู่ในเมืองอื่นและต้องมาที่สนามบินเพื่อเยี่ยมฉัน
Dawood ibn Kareem

29
แม้ว่าจะไม่ใช่คำตอบสำหรับคำถาม แต่ HTTP 451 (RFC 7725) อาจมีประโยชน์สำหรับผู้อ่านในอนาคตที่พบคำถามนี้ วัตถุประสงค์หลักคือเพื่อระบุว่าเนื้อหาไม่พร้อมให้บริการเนื่องจากมีการร้องขอทางกฎหมายการกระทำหรือข้อ จำกัด (ลิขสิทธิ์คำสั่งศาล ฯลฯ )
Tyzoid

34
หากไม่มีอะไรผิดปกติกับการเชื่อมต่อเครือข่ายการรับรองความถูกต้องไม่มีข้อผิดพลาดภายในแอปพลิเคชันและการป้อนข้อมูลที่ถูกต้องทางไวยากรณ์นั้นไม่ควรมีข้อความแสดงข้อผิดพลาด ด้วย "เราไม่ได้ให้บริการของเราในพื้นที่นี้" คุณได้ออกจากปัญหาเทคโนโลยีและไปสู่ปัญหาทางธุรกิจดังนั้นฉันจึงไม่แน่ใจว่าข้อผิดพลาด HTTP จะเหมาะสม ฉันคิดว่าคุณควรให้ข้อความ 200 และ (หรือ 302 และเปลี่ยนเส้นทางไป) ที่เหมาะสมเกี่ยวกับ "ขออภัยบริการของเรายังไม่มีให้บริการในพื้นที่ของคุณ - แต่เรากำลังขยายตัว - กลับมาตรวจสอบอีกครั้งในช่วงปลายปี 2019!" หรืออะไรก็ตามที่ฝ่ายการตลาดเกิดขึ้น
ivanivan

7
ไม่ชัดเจนจากคำถามว่าคุณตั้งใจจะบล็อกการเข้าถึง API ทั้งหมดโดยอิงตามตำแหน่งของคอมพิวเตอร์ไคลเอนต์ (geo IP หรือไม่) หรือหากคุณขอรหัสตอบกลับสำหรับคำขอ API ที่ล้มเหลวโดยเฉพาะ (เช่น book? address = 123_example_st_london) . เป็นส่วนที่ตั้งของอินพุตหรือไม่หรือคุณมีตำแหน่งของลูกค้าด้วยวิธีอื่นหรือไม่?
Ben

คำตอบ:


102

รหัสข้อผิดพลาด HTTP ใด ๆ จะไม่เหมาะสม ไม่มีข้อผิดพลาดหรือปัญหาของการเรียงลำดับใด ๆ จากเปอร์สเปคทีฟ HTTP ดังนั้นจึงควรมีบางอย่างในช่วง 200 คุณแจ้งผู้ใช้ของคุณอย่างสุภาพว่าพวกเขาจะไม่ได้รับบริการโดยส่งเอกสารที่บอกให้พวกเขาทราบ และทั้งหมดนี้เป็นไปด้วยดี

ผู้ใช้จะไม่สามารถที่จะใช้แอพลิเคชัน นั่นคือการตัดสินใจอย่างมีสติที่ทำโดยตรรกะทางธุรกิจของคุณไม่ใช่อุบัติเหตุ ในระดับ HTTP ทุกอย่างเป็นสิ่งที่น่ายกย่อง

แก้ไข

ดูเหมือนว่าสิ่งที่เรากำลังดูที่นี่คือการปะทะกันของโรงเรียนเก่ากับโรงเรียนใหม่ เมื่อ HTTP ได้รับการออกแบบไม่มีบริการเว็บไม่มีสบู่ไม่มี JSON ไม่มีหลักการส่วนที่เหลือ เนื่องจากโปรโตคอลด้านบน TCP ได้พิจารณาระดับแอปพลิเคชัน (ใกล้เคียง) แล้วและมีการกำหนดรหัสสถานะระดับสูงจำนวนมาก เมื่อเว็บเริ่มที่จะใช้งานที่สมบูรณ์ยิ่งขึ้นบริการระดับสูงและวิธีการทั่วไปในการขนส่ง "ซองจดหมาย" จำเป็นต้องใช้นักออกแบบ hi-jacked HTTP แทนที่จะกำหนดโปรโตคอลที่ใหม่กว่าและสะอาดกว่าเพียงเพราะ HTTP เป็นที่แพร่หลาย

ดังนั้นในบริบทการให้บริการเว็บที่ทันสมัย ​​HTTP ย่อมเป็นเพียงเล็กน้อยกว่าเลเยอร์การขนส่งที่โง่เง่าและรหัสส่วนใหญ่อาจถูกพิจารณาว่าไม่เหมาะสมหรือล้าสมัย เพียงเลือกอย่างใดอย่างหนึ่งเพราะใกล้กับสถานะแอปพลิเคชันของคุณและเกิดขึ้นในรายการที่ครั้งหนึ่งเคยหมายความว่าบางสิ่งบางอย่างอาจดูไม่เป็นอันตราย แต่ฉันคิดว่ามันจะส่งข้อความผิด คุณไม่ต้องการให้ HTTP เล่นบทบาทนั้นในบริบทบริการเว็บ


56
ด้วยตรรกะนี้ข้อผิดพลาดของแอปพลิเคชันใด ๆควรส่งคืนเป็น 200 และคำขอทั้งหมดควรเป็น POST แม้กระทั่งการลบ วิธีการนี้ใช้ HTTP เป็นโปรโตคอลการขนส่งแบบทึบ - เช่น TCP นี่ไม่ใช่วิธีที่ API ของการบริการเว็บมักจะได้รับการปฏิบัติ - พวกเขาพยายามใช้ประโยชน์จากความหมายของ HTTP มาตรฐานสำหรับภาษา API ทำไมไม่ส่งคืน 401 สำหรับไม่ได้รับอนุญาตแทนที่จะส่งคืน 200 ด้วยรหัสข้อผิดพลาดที่กำหนดเองและไม่ได้มาตรฐาน
Avner Shahar-Kashtan

31
ด้วยตรรกะนี้แอปพลิเคชันไม่ควรตอบกลับใด ๆ ในช่วง 400 นี่เป็นเงื่อนไขที่แม่นยำสำหรับการตอบสนอง 400 ช่วง ประโยคแรกของคุณใช้ได้กับทุกคำตอบในอนาคตเช่นเดียวกับประโยคที่โพสต์ก่อนหน้าคุณหรือไม่?
Dawood ibn Kareem

31
ฉันต้องยอมรับที่นี่ว่านี่เป็นเพียง 200 ธรรมดาผู้ใช้ถามคำถามเราเข้าใจมันเรารู้คำตอบที่ถูกต้องและเราได้ให้คำตอบแก่เขา (ซึ่งเป็น "ไม่") ทุกอย่างเป็นไปได้ใน HTTP land
Lee Daniel Crocker

8
เฮ่ ... การเดินทางอย่างรวดเร็วจาก "นี่ไม่ใช่ข้อผิดพลาด" ถึง"ดังนั้นคุณกำลังพูดว่าไม่มีอะไรผิดพลาดหรือไม่"
svidgen

28
นี้. "คุณพยายามเข้าถึง URL ที่ไม่มีอยู่" นั้นแตกต่างจาก "บริษัท ของเราไม่ทำงานในพื้นที่ของคุณ" มีเพียงสิ่งเดียวที่เกี่ยวข้องกับ HTTP
CJ Dennis

88

5xxข้อผิดพลาดคือข้อผิดพลาดของเซิร์ฟเวอร์ - มีบางอย่างผิดปกติบนเซิร์ฟเวอร์ โดยเฉพาะ503หมายถึง:

เซิร์ฟเวอร์ไม่สามารถจัดการการร้องขอได้ในขณะนี้เนื่องจากการโอเวอร์โหลดชั่วคราวหรือการบำรุงรักษาตามกำหนดเวลา

4xxข้อผิดพลาดคือข้อผิดพลาดของลูกค้า - ลูกค้ากำลังร้องขอว่าเซิร์ฟเวอร์ไม่สามารถหรือไม่เต็มใจที่จะปฏิบัติตาม โดยเฉพาะ403บ่งบอกว่า

เซิร์ฟเวอร์เข้าใจคำขอ แต่ปฏิเสธที่จะอนุญาต เซิร์ฟเวอร์ที่ต้องการเปิดเผยสู่สาธารณะว่าทำไมคำขอถูกห้ามสามารถอธิบายเหตุผลดังกล่าวได้ในเพย์โหลดการตอบสนอง (ถ้ามี) [.. ] อย่างไรก็ตามคำขออาจถูกห้ามด้วยเหตุผลที่ไม่เกี่ยวข้องกับข้อมูลประจำตัว

ฉันจะยืนยันว่า503ไม่ถูกต้องเพราะนี่ไม่ใช่ปัญหาชั่วคราว - คุณไม่สนับสนุนคำขอในพื้นที่ระยะเวลา อาร์กิวเมนต์อาจเกิดขึ้นได้ในที่สุดคุณหวังว่าจะสนับสนุนพื้นที่ แต่เจตนาของรหัสคือการรวมส่วนหัวที่ระบุว่าเมื่อใดที่ไคลเอ็นต์สามารถลองอีกครั้งได้ "ใน 6 เดือน" ไม่เป็นไปตามเจตนา

403 เป็นทางเลือกที่ดีกว่าเพราะบริการของคุณไม่อนุญาตการร้องขอจากบางพื้นที่


403 สำหรับกรณีที่มีการห้ามการเข้าถึงและลูกค้าไม่สามารถทำอะไรกับมันได้ แต่ในกรณีนี้ลูกค้าสามารถ (เข้าไปในรถด้วยแล็ปท็อปหรือโทรศัพท์ของคุณ) ดังนั้น 403 จึงไม่เหมาะสม
gnasher729

2
@ gnasher729 ข้อผิดพลาด 4xx ใช้สำหรับสิ่งที่ไคลเอ็นต์อาจแก้ไขได้ซึ่งรวมถึง 403 สเปค (เชื่อมโยง) ระบุว่าลูกค้าสามารถลองอีกครั้งด้วยข้อมูลรับรองที่แตกต่างกัน (สมมติว่าข้อมูลรับรองเป็นปัญหา)
jaxad0127

22
@ gnasher729 403 ไม่ได้หมายความว่ามนุษย์ทำอะไรไม่ได้เลย หมายความว่าเบราว์เซอร์ไม่สามารถทำอะไรกับมันได้ มนุษย์สามารถทำการรีเซ็ตรหัสผ่านได้ตลอดเวลาคุยกับผู้ดูแลระบบหรือในกรณีนี้ย้ายไปยังเมืองอื่น
slebetman

1
@ gnasher729 ไคลเอ็นต์ไม่ใช่ผู้ใช้
กัปตันแมน

10
5xx = โอ๊ะโอไม่ดีของเราค้างไว้ในขณะที่เราแก้ไขปัญหา 4xx = ขออภัยด้วยนโยบายเราไม่สามารถรองรับคำขอของคุณได้ในขณะนี้ นี่คือเหตุผล ....
candied_orange

46

ทั้งสองอย่างนั้น

หาก API ของคุณได้รับการออกแบบมาอย่างดี URL จะรวมชื่อของเมืองเช่น

http://example.com/API/Vienna/HailRide

หรือ

http://example.com/API/HailRide?city=Vienna

เนื่องจากการระบุตำแหน่งทางภูมิศาสตร์ IP ไม่น่าเชื่อถือผู้ใช้ของคุณอาจใช้ VPN ผู้ใช้ของคุณอาจต้องการเรียกร้องให้คนอื่นเป็นต้นการแนะนำเมืองตามสถานที่ตั้งของผู้ใช้เป็นความรับผิดชอบของลูกค้า API โดยปกติแล้วไคลเอนต์มีทรัพยากรที่ดีกว่ามากสำหรับการระบุตำแหน่งของผู้ใช้อยู่แล้ว (ตัวอย่างเช่นบริการระบุตำแหน่งของอุปกรณ์มือถือ)

เมื่อคุณทำเช่นนั้นแล้วคำตอบที่ถูกต้องคือ

http://example.com/API/SomeUnsupportedCity/HailRide

หรือ

http://example.com/API/HailRide?city=SomeUnsupportedCity

เห็นได้ชัดว่า: 404 ไม่พบ : ไม่มีทรัพยากรสำหรับการเรียกการนั่งที่ SomeUnsupportedCity


6
นี่ควรเป็นคำตอบที่ยอมรับได้: การออกแบบ API ไม่เพียง แต่เกี่ยวกับการปฏิบัติตามรหัสตัวเลขเก่าและสถานการณ์เกี่ยวกับ ฯลฯ ของ vpn นั้นค่อนข้างสมจริง
Edoardo

10
ฉันไม่เห็นด้วยกับสิ่งนี้ การใส่ชื่อเมืองใน URL อาจนำไปสู่ปัญหาทุกประเภทที่เกิดขึ้นเพราะมันบังคับให้ลูกค้าระบุชื่อเมืองตามสถานที่ตั้งและคุณอาจไม่ชอบผลลัพธ์ ตัวอย่างเช่นคุณอยู่ในลอสแองเจลิสหรือเบเวอร์ลี่ฮิลส์หรือไม่? ลอนดอนหรือเวสต์มินสเตอร์? จะเกิดอะไรขึ้นถ้าลูกค้าคิดว่าอยู่ในริชาร์ดสัน แต่คุณต้องการให้ API ให้บริการทั่วพื้นที่ดัลลัส มันจะเป็นความคิดที่ดีกว่าสำหรับลูกค้าที่จะจัดหาสถานที่รับ / ส่ง; เซิร์ฟเวอร์สามารถตรวจสอบว่าพวกเขาอยู่ในพื้นที่ให้บริการและตอบสนองตามความเหมาะสม
Zach Lipton

11
@ZachLipton ฉันค่อนข้างแน่ใจว่าชื่อเมืองเป็นเพียงตัวอย่างเท่านั้นมันขึ้นอยู่กับกฎเกณฑ์ทางธุรกิจที่แท้จริงของ OP ว่าพวกเขากำหนด "เมือง" หรือ "สถานที่" ได้อย่างไร มันอาจจะเป็นการประสานงาน
Bergi

1
@ ZachLipton ไม่จุดที่นี่ไม่มีบริการใช้ IP ของลูกค้าเพื่อทำความเข้าใจกับสถานที่นั่นเป็นเพียงความผิด
Edoardo

3
@eddyce ฉันยอมรับว่าการใช้ IP ของลูกค้าเป็นความคิดที่ไม่ดีด้วยเหตุผลหลายประการ ฉันกำลังพูดว่า / API / Vienna / HailRide มีแนวโน้มที่จะเกิดปัญหาด้วยเช่นกันเพราะลูกค้าต้องการแปลงที่ตั้งเป็นชื่อเมืองและนั่นไม่ใช่การทำแผนที่แบบ 1 ต่อ 1 ที่สอดคล้องกับพื้นที่ที่ บริษัท ทำธุรกิจ
Zach Lipton

26

ดูเหมือนว่าคำถามรูกลม / สี่เหลี่ยมตรึง ทำไมการตอบกลับของคุณเพียงอย่างเดียวจึงจำเป็นต้องเป็นรหัส HTTP รหัสข้อผิดพลาด HTTP อาจไม่ครอบคลุมทุกกรณีการใช้งาน

การเรียก API ทั้งหมดของคุณควรมีการส่งข้อความเพิ่มเติมที่กลับมา - เช่นข้อความแสดงข้อผิดพลาด JSON เล็กน้อย ให้พวกเขา 403 (เพราะแท้จริงพวกเขาไม่ได้รับอนุญาตให้ใช้ API ตามที่ตั้ง) และส่งกลับข้อมูลเพิ่มเติมเล็กน้อยตามที่คุณแนะนำ

หากคุณไม่ทำเช่นนี้ในครั้งต่อไปคุณจะถามรหัสข้อผิดพลาด HTTP ที่จะส่งคืนเมื่อผู้ใช้ขอ SUV แต่มีเพียง Prius เท่านั้น


5
+1 สำหรับประโยคสุดท้ายของคุณ ผลรวมมันขึ้นอย่างสวยงาม
LoztInSpace

1
ดีที่ค่อนข้างชัดเจนจะต้องมีการเปลี่ยนเส้นทาง 3xx บางชนิด ;)
Brandon Mintern

กรณีสุดท้ายอาจรับประกันการตอบสนอง 4xx บางชนิด: ผู้ใช้ทำการร้องขอที่เซิร์ฟเวอร์ไม่สามารถปฏิบัติตาม มันจะเท่ากับ 400 ถ้าตัวเลือกเป็นอินพุตที่ไม่ถูกต้องบางชนิดหรือ 404 ถ้าไม่มีตำแหน่งอยู่ แม้ว่าอาจเป็น 200 หากเป็นเกณฑ์การค้นหาและไม่มีการจับคู่ที่ตรงกัน
jpmc26

11

ทำให้รู้สึกไม่กี่

403 ต้องห้ามสำหรับเหตุผลที่เอริคสไตน์กล่าวถึงในคำตอบของเขา คุณสามารถใช้ข้อมูลต่าง ๆ ที่ได้รับจากคำขอเพื่อตรวจสอบว่าลูกค้าอยู่ที่ไหนและใครเป็นลูกค้าและตามคำขอนั้นเซิร์ฟเวอร์ไม่สามารถหรือไม่เต็มใจที่จะตอบสนอง

อย่างไรก็ตามฉันจะหยิบยก 451 ไม่พร้อมใช้งานด้วยเหตุผลทางกฎหมายเป็นสถานะการส่งคืนที่เป็นไปได้สำหรับบางกรณี สถานะนี้คาดว่าคุณจะรวมลิงค์ (ในส่วนหัว) ไปยังกฎหมายที่เกี่ยวข้อง โดยเฉพาะอย่างยิ่งสำหรับกรณีที่ไม่ถูกกฎหมายสำหรับลูกค้าที่จะเข้าถึงทรัพยากรของคุณและไม่ใช่กรณีทั่วไปของลูกค้าที่มีอยู่ในภูมิภาคหรือพื้นที่ที่ไม่สนับสนุน

ฉันจะหลีกเลี่ยงสถานะ 5xx series - บ่อยครั้งที่มันบ่งบอกถึงปัญหาทางเทคนิคของฝั่งเซิร์ฟเวอร์ ดูเหมือนจะไม่เป็นกรณีที่นี่


อาจเป็นเหตุผลในกรณีนี้คือมันไม่มีเหตุผลที่จะบอกผู้ใช้เกี่ยวกับรถยนต์ที่ไม่ได้อยู่ในเมืองของพวกเขา ดังนั้นไม่ใช่สำหรับ 451
max630

4
@ max630 คุณไม่สามารถคิดได้จากคำถาม 403 ต้องห้ามเป็นส่วนใหญ่มีแนวโน้มทางเลือกที่เหมาะสม อย่างไรก็ตามหากมีข้อ จำกัด ทางกฎหมายในการบริการ 451 ที่เฉพาะเจาะจงมากขึ้นสามารถนำมาใช้แทน 451 มักถูกมองว่าเป็นรุ่นที่เฉพาะเจาะจงมากขึ้นของ 403 สำหรับกรณีการใช้งานที่เฉพาะเจาะจงมากดังนั้นจึงเหมาะสมที่จะนำมาใช้
โธมัสโอเวนส์

8
@ max630 - เป็นไปได้อย่างสมบูรณ์ว่า 451 เหมาะสมที่นี่ เขตอำนาจศาลหลายแห่งกำหนดให้ผู้ให้บริการประเภทนี้ต้องลงทะเบียนกับหน่วยงานระดับภูมิภาคก่อนที่จะให้บริการ จริง ๆ แล้วพวกเขาอาจถูกห้ามตามกฎหมายในการประมวลผลคำขอบางอย่างถ้าพวกเขาออกนอกพื้นที่
จูลส์

5

หากข้อ จำกัด เกิดจากเหตุผลทางกฎหมายรหัสข้อผิดพลาด HTTP ที่เหมาะสมคือHTTP 451 "ไม่พร้อมใช้งานเนื่องจากเหตุผลทางกฎหมาย"

นี้มักจะถูกนำมาใช้ในกรณีของวัสดุที่ถูกเพิกถอนเนื่องจากการกระทำ DMCA หรือคดีเนื่องจากแคมเปญการล่วงละเมิดหรือชอบ แต่จิตวิญญาณและตัวอักษรของคำนิยามการตอบสนองฯ :

เอกสารนี้ระบุรหัสสถานะ Hypertext Transfer Protocol (HTTP) สำหรับใช้เมื่อการเข้าถึงทรัพยากรถูกปฏิเสธเนื่องจากความต้องการทางกฎหมาย

รหัสนี้เป็นการอ้างอิงถึงFahrenheit 451โดย Ray Bradbury


3

ผู้คนมักลืมว่ารหัสสถานะ HTTP นั้นสามารถขยายได้

รหัสสถานะ HTTP สามารถขยายได้ แอ็พพลิเคชัน HTTP ไม่จำเป็นต้องเข้าใจความหมายของรหัสสถานะที่ลงทะเบียนทั้งหมด แต่ความเข้าใจดังกล่าวเป็นที่ต้องการอย่างชัดเจน อย่างไรก็ตามแอปพลิเคชันต้องเข้าใจคลาสของรหัสสถานะใด ๆ ตามที่ระบุไว้โดยหลักแรกและปฏิบัติต่อการตอบสนองใด ๆ ที่ไม่รู้จักซึ่งเทียบเท่ากับรหัสสถานะ x00 ของคลาสนั้นยกเว้นว่าการตอบสนองที่ไม่รู้จักจะต้องไม่ถูกแคช ตัวอย่างเช่นหากลูกค้าได้รับรหัสสถานะที่ไม่รู้จักเป็น 431 ลูกค้าสามารถสันนิษฐานได้ว่ามีบางอย่างผิดปกติกับคำขอและจัดการกับการตอบกลับราวกับว่าได้รับรหัสสถานะ 400 ในกรณีเช่นนี้ตัวแทนผู้ใช้ควรแสดงต่อผู้ใช้ที่เอนทิตีส่งคืนพร้อมการตอบกลับ

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

คุณสามารถสร้างรหัสสถานะของคุณเองในช่วง 400เพื่อใช้งานโดย API และแอปพลิเคชันไคลเอนต์ของคุณ


อืม ... อาจไม่จำเป็นถ้าคำขอมีExpect token;city="Albequerque"ส่วนหัว จากนั้นคำตอบที่เหมาะสมที่สุดคือ 417 ความคาดหวังล้มเหลว tools.ietf.org/html/rfc2616#section-10.4.18 สมมติว่านี่เป็นบริการเว็บ
Berin Loritsch

อาจไม่จำเป็น @BininLoritsch แต่แทนที่จะพยายามบังคับให้เหมาะกับสถานการณ์ในรหัสที่มีอยู่อาจเป็นการดีกว่าที่จะถ่อและใช้แบบกำหนดเอง
RubberDuck

0

ตอนแรกฉันคิดว่า 503 เพราะคำอธิบาย "บริการไม่พร้อมใช้งาน" ดูเหมือนจะสอดคล้องกับปัญหา แต่เมื่อดูที่คำจำกัดความ 503 นั้นเฉพาะเจาะจงกับเซิร์ฟเวอร์ไม่พร้อมใช้งาน จากนั้นคิดให้มากขึ้นคุณกำลังบอกลูกค้าว่ามีปัญหากับคำขอไม่ใช่ปัญหาด้านเซิร์ฟเวอร์

403 ใกล้เข้ามาเพราะคุณบอกผู้ใช้ว่าคุณได้รับข้อความและเข้าใจ แต่เซิร์ฟเวอร์ไม่ยอมตอบสนอง สิ่งนี้อาจทำให้สับสนเพื่อให้สามารถเพิ่มคำอธิบายที่เป็นข้อความเพื่ออธิบายสถานการณ์ ตาม RFC นั้น 404 ก็เป็นสิ่งทดแทนที่ถูกต้องสำหรับรหัสนี้

หากไม่มีใครฝันถึงรหัสใหม่สำหรับสิ่งนี้ดูเหมือนว่า 403 หรือ 404 จะใกล้เคียงที่สุด


ไม่ใช่รหัส 5xx แน่นอนเพราะนั่นหมายความว่าการลองคำขอเดียวกันที่แน่นอนในภายหลังอาจสำเร็จ รหัส 4xx บอกลูกค้าไม่ให้ลองอีกครั้งโดยไม่เปลี่ยนแปลงคำขอบางอย่างเป็นอย่างน้อย (ในกรณีนี้ฟิลด์ "ตำแหน่งบริการ")
Toby Speight

0

คุณควรจับคู่คำอธิบายข้อผิดพลาดกับรหัสที่คุณให้:

  • ถ้าคุณบอกว่าService not available in your area.คุณควรให้404เพราะคุณอ้างว่าบริการไม่พร้อมใช้งาน

  • ถ้าคุณบอกว่าYou are not authorized for this service in your area.คุณควรให้403เพราะคุณอ้างว่าโทรไม่ได้รับอนุญาต

ฉันจะไปที่สอง


6
404 ไม่ได้เกี่ยวกับความพร้อมมันเป็นเรื่องของการดำรงอยู่ เพียงเพราะบริการไม่สามารถใช้ได้ในบางสถานการณ์คุณไม่ควรให้การตอบกลับ 404 เว้นแต่คุณต้องการให้คนเชื่อว่าไม่มีอยู่เลย การตอบสนอง 404 จะไม่มีความหมายสำหรับสถานการณ์นี้
Jules

@jules ตามข้อมูลจำเพาะสำหรับ 403 (ซึ่งอาจล้าสมัย): "หากเซิร์ฟเวอร์ไม่ต้องการให้ข้อมูลนี้แก่ลูกค้าสามารถใช้รหัสสถานะ404 (ไม่พบ) แทน " เน้นทุ่นระเบิด ดังนั้นถ้า 403 ก็โอเค 404 ก็จะเป็นเช่นนั้น แต่ก็ไม่จำเป็นสำหรับเหตุผลที่ให้ไว้
JimmyJames

@JimmyJames - ใช่มันอยู่ในสเปค แต่เป็นความคิดที่ดีจริงๆเพราะมันทำให้ปัญหาการแก้ไขข้อบกพร่องยากมาก ไม่ใช่สิ่งที่คุณต้องการใน API
จูลส์

3
@Jules บริการนี้ไม่มีอยู่ในบางพื้นที่ เหมือนมีร้านค้าเล็ก ๆ มากมายที่มีอยู่ในเมืองของฉันเท่านั้นดังนั้นการขอคำตอบที่ถูกต้องคือ "ไม่มีตัวตน" ในเมืองอื่น
Andy

ehmm พูดคุยเกี่ยวกับ "existance" เกี่ยวกับเส้นทาง url บริการเป็นอย่างน้อย - ปรัชญาเพื่อประโยชน์ของความชัดเจนเมื่อคุณเผยแพร่เส้นทางคุณต้องให้คำตอบ 403 เป็นวิธีที่จะไปในกรณีนี้มีคำอธิบายด้วยวาจาบางอย่างของ สถานการณ์.
Edoardo

0

มีร่างอินเทอร์เน็ตปัจจุบัน (ที่จะหมดอายุในวันที่ 31 ธันวาคม 2018) ที่เสนอการแก้ไขHTTP 451 ไม่พร้อมใช้งานสำหรับสถานะเหตุผลทางกฎหมาย ร่างชี้ให้เห็นว่าการตอบสนอง 451 ควรมีgeo-scope-blockส่วนหัวที่ควร "สอดคล้องกับรายการรหัสประเทศ alpha-2 ที่คั่นด้วยเครื่องหมายจุลภาคที่กำหนดใน [ISO.3166-1]" อย่างไรก็ตามร่างยังระบุว่าไม่ควรใช้รหัส 451 "โดยผู้ประกอบการเพื่อปฏิเสธการเข้าถึงทรัพยากรบนพื้นฐานของนโยบายที่ระบุโดยผู้ประกอบการ (ตรงข้ามกับความต้องการทางกฎหมายที่ถูกวางไว้บนตัวดำเนินการ)"

ดังนั้นสมมติว่าคุณไม่มีความต้องการทางกฎหมายสำหรับ geoblock 451 ไม่ใช่รหัสที่ถูกต้อง รหัสที่ถูกต้องคืออะไร? คำตอบอื่น ๆ อีกมากมายได้แนะนำ403 สิ่งต้องห้ามแล้ว แต่พวกเขาทั้งหมดดูเหมือนจะเป็น "ฐานความคิดเห็น" ดังนั้นเรามาดูกันว่าคนอื่นทำอะไร:

ดังนั้นจึงไม่มีวิธีแก้ปัญหาสากลคุณเพียงแค่ต้องเลือกวิธีที่เหมาะสมกับสถานการณ์ของคุณมากที่สุด แต่ไม่ว่าคุณจะเลือกให้แน่ใจว่าได้อธิบายถึงปัญหาที่เกิดขึ้นจริงในร่างกายตอบสนอง

ผมว่าจะมีอะไรผิดปกติในเวลาเพียงระบุรหัสสถานะ HTTP ที่กำหนดเองเช่นRubberduck คำตอบอยู่แล้ว รหัสสถานะที่กำหนดเองในช่วง 400 อาจเป็นการโทรที่ค่อนข้างดีเพราะนั่นจะทำให้ได้รับความสนใจจากผู้พัฒนาหากพวกเขาเห็นอะไรอย่าง "สถานะ HTTP 499" "403" นั้นง่ายเกินไปที่จะส่งผ่านเป็น " ตกลงดังนั้นฉันผิดรหัสผ่านของฉันลองทำอย่างอื่นแทน " และผลลัพธ์นั้นใช้เวลาไม่กี่ชั่วโมง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.