2015-01-07 65 views
9

Chúng tôi đang xây dựng một API REST mới.Mã lỗi API REST 500 xử lý

Tôi đã lập luận rằng mã lỗi 500 (Lỗi máy chủ nội bộ) sẽ không bao giờ được trả lại.

Bây giờ, tất nhiên nếu bạn biết thông số của khách hàng sai hoặc bạn có mọi thứ trong tầm kiểm soát và có thể trả về một số mã lỗi thích hợp (ví dụ: 422).

Vì vậy, nếu một lỗi không mong muốn xảy ra các máy chủ có thể:

  1. KHÔNG bắt lỗi bất ngờ để 500 bong bóng lên cho khách hàng
  2. Catch bất kỳ lỗi nào bất ngờ và trở lại một số mã lỗi tín hiệu một "tình huống bất ngờ" (thành thật mà nói, tôi không thể tìm thấy bất kỳ mã lỗi nào như vậy!)

Có các tùy chọn khác không?

Trả lời

9

Đây là lỗi máy chủ chứ không phải lỗi máy khách. Nếu lỗi máy chủ không được trả lại cho máy khách, thì sẽ không tạo được toàn bộ lớp mã trạng thái cho chúng (tức là 5xx).

Bạn không thể che giấu sự thật là bạn đã mắc lỗi lập trình hoặc một số dịch vụ mà bạn dựa vào không khả dụng và chắc chắn đó không phải lỗi của khách hàng. Trả lại bất kỳ phạm vi mã nào khác trong các trường hợp đó so với chuỗi 5xx sẽ không có ý nghĩa gì.

RFC 7231 mentions in section 6.6. Server Error 5xx:

Các 5xx (Server Error) lớp của mã trạng thái chỉ ra rằng server là nhận thức được rằng nó đã sai lầm hoặc không có khả năng thực hiện các phương pháp yêu cầu.

Đây chính là trường hợp. Không có gì "nội bộ" về mã "500 Lỗi Máy chủ Nội bộ" theo nghĩa là nó không được tiếp xúc với khách hàng.

+0

Hiểu và tôi đồng ý. Tôi đã cố gắng để tìm ra nếu một sự khác biệt có thể được thực hiện nếu các nhà phát triển xử lý tất cả các trường hợp hay không. Trên thực tế nó không có ý nghĩa để suy nghĩ theo cách đó. Không có sự khác biệt trong một nhà phát triển bắt gặp lỗi không mong muốn và trả lại 500 hoặc không bắt được nó - thử nghiệm không thành công và đó là vấn đề quan trọng tôi đoán. – faboolous

+1

Nếu bạn muốn khác biệt giữa ngoại lệ máy chủ được xử lý và không được xử lý, bạn có thể thực hiện việc đó bằng cách ghi nhật ký (ở phía máy chủ) hoặc trong phần yêu cầu (vì vậy máy khách, trong trường hợp này là thử nghiệm của bạn). – CodeCaster

+0

làm rõ hữu ích. Nhưng mã trạng thái 500 này có thể được trả về từ máy chủ vì bất kỳ vấn đề định dạng nào trong phần thân yêu cầu không? –

5

Câu hỏi thực sự là tại sao nó tạo ra lỗi 500. Nếu nó có liên quan đến bất kỳ tham số đầu vào nào, thì tôi sẽ cho rằng nó phải được xử lý nội bộ và trả về là lỗi 400 chuỗi. Nói chung, 400, 404 hoặc 406 sẽ phù hợp để phản ánh đầu vào xấu vì quy ước chung là tài nguyên RESTful được xác định duy nhất bởi URL và URL không thể tạo phản hồi hợp lệ là yêu cầu xấu (400) hoặc tương tự.

Nếu lỗi do bất kỳ điều gì khác ngoài các đầu vào được cung cấp một cách rõ ràng hoặc hoàn toàn theo yêu cầu, thì tôi sẽ nói lỗi 500 có khả năng thích hợp. Vì vậy, một kết nối cơ sở dữ liệu không thành công hoặc lỗi không thể đoán trước khác được thể hiện chính xác bằng lỗi loạt 500.

+1

_ "Nếu nó liên quan đến ** bất kỳ tham số đầu vào nào ** [..]: 400" _ - điều gì sẽ xảy ra nếu lỗi được gây ra bởi một ngoại lệ vô điều kiện vô giá trị trên một biến yêu cầu? Nó được gây ra bởi một lỗi lập trình (máy chủ), được kích hoạt bởi yêu cầu (client). Và nếu biến yêu cầu không được yêu cầu bởi logic máy chủ, nhưng lập trình viên đã giả định (do đó không kiểm tra) nó? Vấn đề là: hầu hết các khung công tác web trả lại mã 5xx khi phát hiện sự kết thúc bất thường của phần mềm máy chủ. Khung này không thể phân biệt giữa lỗi máy khách và máy chủ như vậy. – CodeCaster

+2

Đúng, nhưng câu hỏi đã được đóng khung trong bối cảnh thử nghiệm một dịch vụ có lẽ mới và thu hút phản hồi về tình hình cuối cùng sẽ được xử lý như thế nào. Nếu tôi đã thử nghiệm các dịch vụ mới và tạo ra các trường hợp kiểm tra đầu vào trường hợp cạnh qua 500, tôi sẽ gắn cờ đó là một thử nghiệm không thành công và làm việc với nhà phát triển để xử lý trường hợp thử nghiệm hoặc có lỗi mô tả hơn (400, 404, v.v.) hoặc yêu cầu được phục vụ đúng cách (200). Có những nguồn thực sự không lường trước được 500 lỗi, nhưng bạn có thể/nên phòng thủ chống lại chúng càng nhiều càng tốt ngay cả khi điều đó chỉ đơn giản là đưa ra một lỗi thông tin hơn. – tokkov

2

Nói chung, mã phản hồi 5xx cho biết lỗi không có lập trình, chẳng hạn như lỗi kết nối cơ sở dữ liệu hoặc một số lỗi phụ thuộc hệ thống/thư viện khác. Trong nhiều trường hợp, khách hàng có thể gửi lại yêu cầu tương tự trong tương lai và hy vọng nó sẽ thành công. Có, một số khung công tác web sẽ phản hồi với mã 5xx, nhưng thường là kết quả của các lỗi trong mã và khung công tác quá trừu tượng để biết điều gì đã xảy ra, vì vậy nó mặc định là loại phản hồi này; ví dụ đó, tuy nhiên, không có nghĩa là chúng ta nên có thói quen trả lại mã 5xx do hành vi có lập trình không liên quan đến hệ thống quá trình.Có nhiều mã phản hồi được xác định rõ ràng phù hợp hơn mã 5xx. Không thể phân tích cú pháp/xác thực một đầu vào cụ thể không phải là phản hồi 5xx vì mã có thể đáp ứng một phản hồi phù hợp hơn mà không để khách hàng nghĩ rằng họ có thể gửi lại cùng một yêu cầu, khi thực tế, họ không thể.

Để rõ ràng, nếu lỗi mà máy chủ gặp phải do đầu vào CLIENT, thì đây rõ ràng là lỗi CLIENT và phải được xử lý bằng mã phản hồi 4xx. Kỳ vọng là khách hàng sẽ sửa lỗi trong yêu cầu của họ và gửi lại. Tuy nhiên, hoàn toàn có thể chấp nhận được bất kỳ lỗi quá trình nào và diễn giải chúng như một phản ứng 5xx, nhưng lưu ý rằng bạn cũng nên bao gồm thêm thông tin trong phản hồi để cho biết chính xác những gì không thành công; và thậm chí tốt hơn nếu bạn có thể bao gồm thời gian SLA để giải quyết.

Tôi không nghĩ đó là cách hay để diễn giải, "lỗi không mong muốn" dưới dạng lỗi 5xx do lỗi xảy ra.

Đây là một màn hình cảnh báo phổ biến để bắt đầu cảnh báo về 5xx loại lỗi vì các lỗi này thường chỉ ra các hệ thống không thành công, thay vì mã lỗi. Vì vậy, mã cho phù hợp!

3

Bạn đã đề xuất "Bắt bất kỳ lỗi không mong muốn nào và trả lại một số mã lỗi báo hiệu" tình huống không mong muốn "" nhưng không thể tìm thấy mã lỗi thích hợp.

Đoán xem: Đó là những gì có 5xx.

0

80% của thời đại, điều này sẽ do nhập sai bởi trong soapRequest.xml tập tin

Các vấn đề liên quan