Mã trạng thái http cho Dịch vụ trên mạng không có sẵn trong khu vực của bạn là gì?


51

Dịch vụ của chúng tôi là ở 5 thành phố ngay bây giờ. Nếu ai đó cố gắng gọi API dịch vụ của chúng tôi từ bất kỳ thành phố nào khác, chúng tôi muốn đưa ra lỗi này Service not available in your area.

Câu hỏi là, mã http thích hợp sẽ là gì cho lỗi này?

  • Lỗi 503: Dịch vụ không khả dụng
  • 403: Cấm

hay cái gì khác?


52
"Nếu ai đó cố gắng gọi API dịch vụ của chúng tôi từ bất kỳ thành phố nào khác" lưu ý rằng việc định vị địa lý IP thường rất sai, nếu bạn cấm bất kỳ người dùng nào có địa lý IP đến một thành phố khác, bạn rất có thể sẽ khóa người dùng hợp pháp.
Peter Green

43
Tôi không được phép đi xe cho con tôi, người đang ở thành phố khác và cần đến sân bay để thăm tôi?
Dawood nói phục hồi Monica

29
Mặc dù không phải là câu trả lời cho câu hỏi, HTTP 451 (RFC 7725) có thể hữu ích cho những độc giả tương lai tìm thấy câu hỏi này. Mục đích chính của nó là để chỉ ra nội dung không có sẵn do yêu cầu pháp lý, hành động hoặc hạn chế (bản quyền, lệnh của tòa án, v.v.)
Tyzoid

34
Nếu không có gì sai với kết nối mạng, xác thực, không có lỗi bên trong ứng dụng và đầu vào hợp lệ về mặt cú pháp thì không nên có thông báo lỗi. Với "chúng tôi không cung cấp dịch vụ của chúng tôi trong lĩnh vực này", bạn đã để lại các vấn đề về công nghệ và gặp phải các vấn đề kinh doanh, vì vậy tôi không chắc chắn lỗi HTTP sẽ phù hợp. Tôi nghĩ bạn nên cung cấp 200 và (hoặc 302 và chuyển hướng đến) một thông điệp phù hợp về "xin lỗi dịch vụ của chúng tôi không có sẵn trong khu vực của bạn - Tuy nhiên, chúng tôi đang mở rộng - Kiểm tra lại vào cuối năm 2019!" hoặc bất cứ điều gì các bộ phận tiếp thị đưa ra.
ivanivan

7
Không rõ từ câu hỏi liệu bạn có ý định chặn tất cả quyền truy cập vào API dựa trên vị trí của máy khách (IP địa lý không?) Hoặc nếu bạn đang yêu cầu mã phản hồi cho một yêu cầu API thất bại cụ thể (ví dụ: book? Address = 123_example_st_london) . Là một phần vị trí của đầu vào, hoặc bạn có vị trí của khách hàng theo cách khác?
Ben

Câu trả lời:


101

Bất kỳ mã lỗi HTTP sẽ không phù hợp. Không có lỗi hoặc vấn đề thuộc bất kỳ loại nào từ phối cảnh HTTP, vì vậy nó phải là một cái gì đó trong phạm vi 200. Bạn lịch sự thông báo cho một số người dùng của bạn rằng họ sẽ không được phục vụ bằng cách gửi lại tài liệu cho họ biết như vậy. Và tất cả điều này diễn ra tốt đẹp.

Người dùng sẽ không thể sử dụng ứng dụng của bạn . Đó là một quyết định có ý thức được đưa ra bởi logic kinh doanh của bạn, không phải là một rủi ro. Ở cấp độ HTTP, mọi thứ đều tuyệt vời.

Biên tập

Có vẻ như những gì chúng ta đang xem xét ở đây là sự xung đột giữa trường học cũ và trường học mới. Khi HTTP được thiết kế, không có dịch vụ web, không có SOAP, không có JSON, không có nguyên tắc REST. Là một giao thức trên TCP, điều này đã được xem xét (gần với) cấp độ ứng dụng và nhiều mã trạng thái cấp cao đã được xác định. Khi web bắt đầu được sử dụng cho các dịch vụ phong phú hơn, mức độ cao hơn và phương tiện phổ biến để vận chuyển "phong bì" là bắt buộc, các nhà thiết kế đã sử dụng HTTP thay vì xác định giao thức mới hơn và sạch hơn, chỉ vì HTTP có mặt ở khắp mọi nơi.

Vì vậy, trong bối cảnh dịch vụ web hiện đại, HTTP thực sự ít hơn một lớp vận chuyển ngu ngốc và hầu hết các mã của nó có thể được coi là không áp dụng hoặc lỗi thời. Chỉ cần chọn một vì nó gần với trạng thái ứng dụng của bạn và tình cờ nằm ​​trong danh sách đó có nghĩa là một cái gì đó có vẻ vô hại, nhưng tôi nghĩ rằng nó sẽ gửi một thông điệp sai. Bạn không muốn HTTP đóng vai trò điều tiết đó trong ngữ cảnh dịch vụ web.


56
Theo logic này, bất kỳ lỗi ứng dụng nào cũng phải được trả về là 200. Và tất cả các yêu cầu phải được POST, thậm chí xóa. Cách tiếp cận này coi HTTP là một giao thức vận chuyển mờ - như TCP. Đây không phải là cách API dịch vụ web thường được xử lý - họ cố gắng tận dụng ngữ nghĩa HTTP là ngôn ngữ chuẩn cho API. Tại sao không trả lại 401 cho Không được phép, thay vì trả lại 200 với mã lỗi tùy chỉnh, không chuẩn?
Avner Shahar-Kashtan

31
Theo logic này, không có ứng dụng nào sẽ trả về bất kỳ phản hồi nào trong phạm vi 400. Đây chính xác là loại điều kiện mà 400 phạm vi phản hồi dành cho. Ngoài ra, câu đầu tiên của bạn có áp dụng cho tất cả các câu trả lời trong tương lai, cũng như những câu đã được đăng trước bạn không?
Dawood nói phục hồi Monica

31
Tôi phải đồng ý ở đây rằng đây chỉ là 200. Người dùng đã hỏi một câu hỏi, chúng tôi hiểu nó, chúng tôi biết câu trả lời đúng và chúng tôi đã cung cấp cho anh ta câu trả lời (điều này xảy ra là "Không"). Tất cả đều tốt trong đất HTTP.
Lee Daniel Crocker

8
Hehe ... hành trình nhanh chóng từ "đây không thực sự là một lỗi" đến "vì vậy, bạn đang nói không có gì là lỗi cả?"
Svidgen

28
Điều này. "Bạn đã cố truy cập một URL không tồn tại" rất khác với "Công ty chúng tôi không hoạt động trong khu vực của bạn". Chỉ có một cái có liên quan đến HTTP.
CJ Dennis

87

5xxlỗi là lỗi máy chủ - đã xảy ra lỗi trên máy chủ. Cụ thể, 503 chỉ ra rằng:

máy chủ hiện không thể xử lý yêu cầu do quá tải tạm thời hoặc bảo trì theo lịch trình

4xxlỗi là lỗi máy khách - máy khách đang yêu cầu máy chủ không thể hoặc không muốn thực hiện. Cụ thể, 403 chỉ ra rằng

máy chủ hiểu yêu cầu nhưng từ chối ủy quyền. Một máy chủ muốn công khai lý do tại sao yêu cầu bị cấm có thể mô tả lý do đó trong tải trọng phản hồi (nếu có). [..] Tuy nhiên, một yêu cầu có thể bị cấm vì những lý do không liên quan đến thông tin đăng nhập.

Tôi cho rằng điều đó 503rõ ràng không chính xác, bởi vì đây không phải là vấn đề tạm thời - bạn không hỗ trợ các yêu cầu trong khu vực đó, giai đoạn đó. Đối số có thể được đưa ra là cuối cùng bạn hy vọng hỗ trợ khu vực, nhưng mục đích của mã là bao gồm một tiêu đề cho biết khi nào khách hàng có thể thử lại. "Trong 6 tháng" không tuân thủ ý định.

403 là một lựa chọn tốt hơn vì dịch vụ của bạn chỉ đơn giản là cấm các yêu cầu từ một số địa phương nhất định.


403 dành cho các trường hợp cấm truy cập và khách hàng không thể làm gì với nó. Nhưng trong trường hợp này, khách hàng có thể (lên xe bằng máy tính xách tay hoặc điện thoại của bạn), vì vậy 403 là không phù hợp.
gnasher729

2
@ gnasher729 Lỗi 4xx dành cho những thứ mà khách hàng có thể sửa được, bao gồm 403. Thông số (được liên kết) nêu cụ thể khách hàng có thể thử lại với các thông tin khác nhau (giả sử thông tin là vấn đề).
jaxad0127

22
@ gnasher729 403 không có nghĩa là con người không thể làm bất cứ điều gì về nó. Nó có nghĩa là trình duyệt không thể làm bất cứ điều gì về nó. Con người luôn có thể thực hiện đặt lại mật khẩu, nói chuyện với quản trị viên hoặc trong trường hợp này chuyển đến thành phố khác.
slebetman

1
@ gnasher729 Khách hàng không phải là người dùng.
Thuyền trưởng Man

10
5xx = Rất tiếc, chúng tôi sẽ khắc phục sự cố. 4xx = Chúng tôi xin lỗi nhưng theo chính sách, chúng tôi không thể đáp ứng yêu cầu của bạn tại thời điểm này. Đây là lý do ....
candied_orange

46

Không phải của những người đó.

Nếu API của bạn được thiết kế tốt, URL sẽ bao gồm tên của thành phố, ví dụ:

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

hoặc là

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

do định vị địa lý IP không đáng tin cậy, người dùng của bạn có thể đang sử dụng VPN, người dùng của bạn có thể muốn đi nhờ người khác, v.v. Đề xuất một thành phố dựa trên vị trí của người dùng là trách nhiệm của khách hàng API . Thông thường, khách hàng có nhiều tài nguyên tốt hơn để xác định vị trí của người dùng (ví dụ: dịch vụ vị trí của thiết bị di động).

Khi bạn đã thực hiện điều đó, câu trả lời chính xác cho

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

hoặc là

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

trở nên rõ ràng: 404 Không tìm thấy : Không có tài nguyên cho việc đi xe tại một sốUnsupportedCity tồn tại.


6
Đây phải là câu trả lời được chấp nhận: Thiết kế API không chỉ là việc tuân thủ các mã số cũ và kịch bản về vpn v.v ... là khá thực tế.
Edoardo

10
Tôi phải không đồng ý với điều này. Bao gồm tên của thành phố trong URL có thể dẫn đến tất cả các loại vấn đề, bởi vì nó buộc khách hàng phải xác định tên thành phố dựa trên vị trí và bạn có thể không thích kết quả. Ví dụ, bạn đang ở Los Angeles hay Hillsly Hills? Luân Đôn hay Westminster? Điều gì xảy ra nếu khách hàng nghĩ rằng đó là ở Richardson, nhưng bạn muốn API phục vụ toàn bộ khu vực Dallas? Nó sẽ là một ý tưởng tốt hơn cho khách hàng chỉ cung cấp các địa điểm đón / thả; máy chủ có thể xác định xem họ có ở trong khu vực dịch vụ hay không và phản hồi tương ứng.
Zach Lipton

11
@ZachLipton Tôi khá chắc chắn rằng tên thành phố chỉ là một ví dụ, nó phụ thuộc vào quy tắc kinh doanh thực tế của OP về cách họ định nghĩa "thành phố" hoặc "địa điểm". Nó cũng có thể là một sự phối hợp.
Bergi

1
@ZachLipton không, vấn đề ở đây là không có dịch vụ sử dụng IP của khách hàng để hiểu vị trí, điều đó chỉ sai
Edoardo

3
@eddyce Tôi đồng ý rằng sử dụng IP của khách hàng là một ý tưởng tồi vì nhiều lý do. Tôi đang nói rằng / API / Vienna / HailRide cũng dễ gặp sự cố, bởi vì nó yêu cầu khách hàng chuyển đổi vị trí thành tên thành phố và đó không phải là ánh xạ 1-1 thành tương ứng với các khu vực mà công ty kinh doanh.
Zach Lipton

26

Điều này có vẻ như một câu hỏi lỗ tròn / chốt vuông. Tại sao phản hồi duy nhất của bạn cần phải là mã HTTP? Mã lỗi HTTP không thể bao gồm tất cả các trường hợp sử dụng.

Tất cả các cuộc gọi API của bạn sẽ có thêm thông báo quay lại - tức là một thông báo lỗi JSON nhỏ. Cung cấp cho họ 403 (vì thực sự họ không có quyền sử dụng API được cung cấp vị trí) và trả lại một chút thông tin như bạn đang đề xuất.

Nếu bạn không làm điều này thì lần sau bạn sẽ hỏi mã lỗi HTTP nào sẽ trả về khi người dùng yêu cầu một chiếc SUV nhưng chỉ có một chiếc Prius có sẵn.


5
+1 cho câu cuối cùng của bạn. Tổng hợp nó lên độc đáo.
LoztInSpace

1
Vâng, điều đó khá rõ ràng cần phải là chuyển hướng 3xx của một số loại. ;)
Tên thật được điều chỉnh lại vào

Trường hợp cuối cùng có thể đảm bảo phản hồi 4xx thuộc loại nào đó: người dùng đã đưa ra yêu cầu mà máy chủ không thể thực hiện. Sẽ là 400 nếu lựa chọn là một loại đầu vào không hợp lệ hoặc 404 nếu vị trí đó không tồn tại. Mặc dù có thể là 200 nếu đó là tiêu chí tìm kiếm và không có kết quả phù hợp.
jpmc26

11

Một số ít có ý nghĩa.

403 Bị cấm, vì những lý do mà Eric Stein đề cập trong câu trả lời của mình . Bạn có thể sử dụng nhiều thông tin khác nhau được cung cấp bởi yêu cầu để xác định vị trí của khách hàng và khách hàng là ai và, dựa trên yêu cầu đó, máy chủ không thể hoặc không sẵn lòng phản hồi.

Tuy nhiên, tôi cũng sẽ đưa ra 451 Không có sẵn cho các lý do pháp lý như một trạng thái trả lại có thể cho một số trường hợp. Trạng thái này không mong đợi bạn bao gồm (trong các tiêu đề) một liên kết đến pháp luật có liên quan. Nó đặc biệt dành cho các trường hợp khách hàng truy cập tài nguyên của bạn không hợp pháp và không phải là trường hợp chung hơn của khách hàng tồn tại ở khu vực hoặc khu vực không được hỗ trợ.

Tôi sẽ tránh các loạt trạng thái 5xx - những trạng thái này thường chỉ ra các vấn đề kỹ thuật phía máy chủ. Nó không xuất hiện ở đây.


Có lẽ lý do trong trường hợp này là không có ý nghĩa gì để nói với người dùng về những chiếc xe không có trong thành phố của họ. Vì vậy, đây không phải là trường hợp của 451
max630

4
@ max630 Bạn không thể cho rằng từ câu hỏi. 403 Cấm rất có thể là sự lựa chọn đúng đắn. Tuy nhiên, nếu có các hạn chế pháp lý đối với dịch vụ, 451 cụ thể hơn có thể được sử dụng thay thế. 451 thường được xem là phiên bản cụ thể hơn của 403 cho các trường hợp sử dụng rất cụ thể, vì vậy sẽ rất hợp lý khi đưa nó lên.
Thomas Owens

8
@ max630 - hoàn toàn có thể 451 phù hợp ở đây. Nhiều khu vực pháp lý yêu cầu các nhà khai thác loại dịch vụ này phải được đăng ký với chính quyền khu vực trước khi cung cấp dịch vụ. Họ thực sự có thể bị cấm một cách hợp pháp để xử lý các yêu cầu nhất định nếu chúng có nguồn gốc ngoài khu vực.
Jules

5

Nếu hạn chế là do lý do pháp lý, thì mã lỗi HTTP thích hợp là HTTP 451, "Không khả dụng do lý do pháp lý."

Điều này thường được sử dụng trong trường hợp tài liệu đã bị thu hồi do hành động hoặc vụ kiện DMCA do các chiến dịch quấy rối hoặc tương tự, nhưng tinh thần và thư của định nghĩa phản hồi nêu rõ:

Tài liệu này chỉ định mã trạng thái Giao thức truyền siêu văn bản (HTTP) để sử dụng khi quyền truy cập tài nguyên bị từ chối do hậu quả của nhu cầu pháp lý.

Bản thân mã này là một tham chiếu đến Fahrenheit 451 của Ray Bradbury.


3

Mọi người thường quên rằng mã trạng thái HTTP có thể mở rộng.

Mã trạng thái HTTP có thể mở rộng. Các ứng dụng HTTP không bắt buộc phải hiểu ý nghĩa của tất cả các mã trạng thái đã đăng ký, mặc dù hiểu rõ như vậy rõ ràng là mong muốn. Tuy nhiên, các ứng dụng PHẢI hiểu lớp của bất kỳ mã trạng thái nào, như được chỉ ra bởi chữ số đầu tiên và coi bất kỳ phản hồi không được nhận dạng nào tương đương với mã trạng thái x00 của lớp đó, ngoại trừ phản hồi không được nhận dạng PHẢI KHÔNG được lưu vào bộ nhớ cache. Ví dụ: nếu khách hàng nhận được mã trạng thái không được nhận dạng là 431, thì có thể giả định rằng có yêu cầu sai với yêu cầu của mình và xử lý phản hồi như thể đã nhận được 400 mã trạng thái. Trong các trường hợp như vậy, tác nhân người dùng NÊN trình bày cho người dùng thực thể được trả về với phản hồi,

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

Bạn luôn có thể tạo mã trạng thái của riêng mình trong phạm vi 400 để sử dụng bởi ứng dụng khách và API của bạn.


Hmm ... có thể không cần thiết nếu yêu cầu bao gồm một Expect token;city="Albequerque"tiêu đề. Sau đó, phản ứng thích hợp nhất sẽ là 417, kỳ vọng thất bại. tools.ietf.org/html/rfc2616#section-10.4.18 Giả sử tất nhiên rằng đây là cho một dịch vụ web.
Berin Loritsch

Có lẽ không cần thiết @BerinLoritsch, nhưng thay vì cố gắng để có hiệu lực phù hợp với một tình huống vào một mã hiện tại, nó có thể được tốt hơn để chỉ punt và sử dụng một tùy chỉnh.
RubberDuck

0

Lúc đầu, tôi nghĩ 503 vì mô tả "dịch vụ không khả dụng" có vẻ phù hợp với vấn đề nhưng nhìn vào các định nghĩa , 503 thực sự cụ thể đối với sự không có sẵn của máy chủ. Sau đó suy nghĩ nhiều hơn, bạn đang nói với khách hàng rằng có một vấn đề với yêu cầu, không phải là có vấn đề về phía máy chủ.

403 gần hơn vì bạn đang nói với người dùng rằng bạn đã nhận được tin nhắn và hiểu nó nhưng máy chủ không sẵn lòng đáp ứng. Điều này có thể gây nhầm lẫn để có thể thêm một lời giải thích bằng văn bản để mô tả kịch bản. Theo RFC, 404 cũng là một thay thế hợp lệ cho mã này.

Trừ khi ai đó đã mơ thấy một mã mới cho điều này, 403 hoặc 404 dường như là gần nhất.


Chắc chắn không phải là mã 5xx, bởi vì điều đó ngụ ý rằng việc thử chính xác cùng một yêu cầu sau này có thể thành công. Mã 4xx chắc chắn yêu cầu khách hàng không thử lại mà không thay đổi ít nhất một số yêu cầu (trong trường hợp này là trường "vị trí dịch vụ").
Toby Speight

0

Bạn phải khớp mô tả lỗi với mã mà bạn đang đưa ra:

  • nếu bạn nói Service not available in your area.thì bạn nên đưa ra 404vì bạn cho rằng dịch vụ này không có sẵn .

  • nếu bạn nói You are not authorized for this service in your area.thì bạn nên đưa ra 403vì bạn cho rằng người gọi không được ủy quyền .

Tôi sẽ đi lần thứ hai.


6
404 không phải là về tính khả dụng , nó là về sự tồn tại . Chỉ vì một số dịch vụ không khả dụng trong một số trường hợp, bạn không nên cung cấp phản hồi 404 trừ khi bạn muốn mọi người tin rằng nó hoàn toàn không tồn tại. Một phản hồi 404 sẽ là vô nghĩa cho tình huống này.
Jules

@jules Theo thông số kỹ thuật cho 403 (có thể đã lỗi thời): "Nếu máy chủ không muốn cung cấp thông tin này cho khách hàng, mã trạng thái 404 (Không tìm thấy) có thể được sử dụng thay thế. " Vì vậy, nếu 403 là OK, thì 404 cũng sẽ như vậy, nhưng không nhất thiết là vì lý do được đưa ra.
JimmyJames

@JimmyJames - vâng, nó nằm trong đặc tả, nhưng là một ý tưởng thực sự tồi tệ vì nó làm cho vấn đề gỡ lỗi trở nên vô cùng khó khăn. Không phải những gì bạn muốn trong một API.
Jules

3
@Jules Dịch vụ không tồn tại ở một số khu vực. Giống như có nhiều cửa hàng nhỏ chỉ tồn tại trong thành phố của tôi, vì vậy hãy hỏi địa chỉ của họ ở một thành phố khác, câu trả lời đúng là "không tồn tại".
Andy

ehmm nói về "sự tồn tại" về đường dẫn url dịch vụ là ít nhất - về mặt triết học, vì rõ ràng một khi bạn xuất bản một đường dẫn bạn phải cung cấp câu trả lời, 403 là cách để đi trong trường hợp này, với một loại mô tả bằng lời nói về tình huống.
Edoardo

0

Có một Dự thảo Internet hiện tại (sẽ hết hạn vào ngày 31 tháng 12 năm 2018) đề xuất sửa đổi đối với HTTP 451 Không khả dụng cho tình trạng Lý do pháp lý . Dự thảo đề xuất rằng phản hồi 451 phải chứa một geo-scope-blocktiêu đề "tương ứng với danh sách mã quốc gia alpha-2 được phân tách bằng dấu phẩy được xác định trong [ISO.3166-1]". Tuy nhiên, dự thảo cũng chỉ rõ rằng mã 451 không nên được sử dụng "bởi nhà điều hành để từ chối quyền truy cập vào tài nguyên trên cơ sở chính sách được chỉ định bởi nhà điều hành (trái ngược với yêu cầu pháp lý được đặt trên nhà điều hành)".

Vì vậy, giả sử bạn không có nhu cầu hợp pháp cho geoblock, 451 không phải là mã chính xác. Mã chính xác là gì sau đó? Chà, rất nhiều câu trả lời khác đã đề xuất 403 Bị cấm , nhưng tất cả chúng dường như là "dựa trên ý kiến", vì vậy hãy xem những gì người khác đang làm:

Vì vậy, không có một giải pháp phổ quát nào, bạn sẽ phải chọn một giải pháp mà bạn cảm thấy phù hợp nhất với tình huống của mình. Nhưng cho dù bạn chọn cách nào, hãy chắc chắn giải thích vấn đề thực tế trong phần phản hồi .

Tôi muốn nói rằng sẽ không có gì sai khi chỉ định mã trạng thái HTTP tùy chỉnh, như RubberDuck đã trả lời . Mã trạng thái tùy chỉnh trong phạm vi 400 thực sự thậm chí có thể là một cuộc gọi khá tốt, bởi vì điều đó chắc chắn sẽ thu hút sự chú ý của các nhà phát triển nếu họ thấy một cái gì đó như "trạng thái HTTP 499". "403" quá dễ để vượt qua là " OK vì vậy tôi đã nhầm mật khẩu của mình, thay vào đó hãy thử một cái gì đó khác " và điều đó dẫn đến lãng phí hàng giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.