Định dạng phản hồi API JSON chuẩn?


697

Các tiêu chuẩn hoặc thực tiễn tốt nhất có tồn tại để cấu trúc các phản hồi JSON từ API không? Rõ ràng, dữ liệu của mỗi ứng dụng là khác nhau, do đó tôi không quan tâm lắm, mà là "bản tóm tắt phản hồi", nếu bạn muốn. Một ví dụ về những gì tôi muốn nói:

Yêu cầu thành công:

{
  "success": true,
  "payload": {
    /* Application-specific data would go here. */
  }
}

Yêu cầu thất bại:

{
  "success": false,
  "payload": {
    /* Application-specific data would go here. */
  },
  "error": {
    "code": 123,
    "message": "An error occurred!"
  }
}

16
Mọi người có lẽ đã học được từ SOAP và sẽ không xây dựng lại ...
Denys Séguret

18
@dystroy: Muốn giải thích bình luận của bạn?
FtDRbwLXw6

5
Tôi thực sự quan tâm đến câu hỏi này khi tôi phải thiết kế API JSON gần đây và thấy mình tự hỏi liệu chúng có phải là bất kỳ tiêu chuẩn nào xác định định dạng phản hồi không. Bạn thực sự trông khá đẹp và trông đáng sử dụng nếu bạn không tìm thấy một tiêu chuẩn. Thật xấu hổ khi các câu trả lời được cung cấp không thực sự giải quyết câu hỏi.
Alex

13
@Alex thật không may, đó là vì dù bạn đi đâu, không có tiêu chuẩn. Không chỉ trong chính JSON, mà còn về cách sử dụng nó cho các ứng dụng RESTful hoặc bất kỳ thứ gì khác thuộc loại này. Mọi người làm điều đó khác nhau. Bạn có thể thoải mái tuân theo các thực tiễn tốt nhất (phản hồi HTTP, cấu trúc gói có ý nghĩa, hướng tới cấu trúc dữ liệu của bạn để tiêu thụ bởi hệ thống của bạn), nhưng mọi người là nhà phân phối chính đều thực hiện ít nhất một điều khác với những người khác. .. Không có tiêu chuẩn, và sẽ không có khả năng, vì vậy hãy xây dựng một cái gì đó vững chắc và xây dựng nó để phù hợp với bạn.
Norguard

5
@Norguard có tiêu chuẩn (xem câu trả lời của tôi). Trong thực tế Điều tốt đẹp về tiêu chuẩn là bạn có rất nhiều lựa chọn. - Andrew Tanenbaum
Adam Gent

Câu trả lời:


640

Vâng, có một vài tiêu chuẩn (mặc dù một số quyền tự do theo định nghĩa của tiêu chuẩn) đã xuất hiện:

  1. API JSON - API JSON cũng bao gồm việc tạo và cập nhật tài nguyên, không chỉ phản hồi.
  2. JSend - Đơn giản và có lẽ là những gì bạn đang làm.
  3. Giao thức JSON OData - Rất phức tạp.
  4. HAL - Thích OData nhưng nhắm đến HATEOAS thích.

Ngoài ra còn có các định dạng mô tả API JSON:


19
Cảm ơn bạn. Đặc biệt là chính xác những gì tôi đang tìm kiếm. Nó tương tự như những gì tôi đã làm, nhưng có một số lợi ích mà phương pháp của tôi không làm được. Công bằng với @trungly, JSend cũng rất gần với câu trả lời của chính mình.
FtDRbwLXw6

8
Đối với các phản hồi lỗi cụ thể, tôi cũng thích Dự thảo chi tiết sự cố cho bản thảo RFC API HTTP .
Pieter Ennes

1
Có lẽ bạn muốn thêm code.google.com/p/json-service vào danh sách định dạng mô tả?
emilesilvis

1
Tôi nghĩ nhãn "Một tiêu chuẩn được đề xuất cho Rails" là một chút quá lời - đây chỉ là một giải pháp của lập trình viên. Không chắc chắn điều gì làm cho nó trở thành "tiêu chuẩn được đề xuất" (đặc biệt nếu bạn nhìn vào mức độ phổ biến của đá quý - không giống như nhiều người đang sử dụng thứ này)? Cá nhân tôi không nghĩ rằng hầu hết các lập trình viên Rails sẽ đề xuất giải pháp này vì sử dụng phần thân phản hồi thay vì tiêu đề HTTP cho trạng thái
Iwo Dziechciarow

2
Hướng dẫn về Phong cách JSON của Google cũng là một tài liệu tham khảo tốt
MRodrigues

195

Hướng dẫn Google JSON

Trả lời thành công data

{
  "data": {
    "id": 1001,
    "name": "Wing"
  }
}

Trả lời lỗi error

{
  "error": {
    "code": 404,
    "message": "ID not found"
  }
}

và nếu khách hàng của bạn là JS, bạn có thể sử dụng if ("error" in response) {}để kiểm tra xem có lỗi không.


13
Trước hết, hướng dẫn Google JSON khuyên bạn nên sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn.
rpozarickij

1
Tôi không chắc liệu bạn có thể xử lý việc này từ API JSON của máy chủ như PlayJson hay không, dù theo cách nào thì nó không thành vấn đề. @ Hoàn toàn các liên kết của bạn bị hỏng
Rhys Bradbury

3
Điều gì về các lỗi cần cung cấp một danh sách các lỗi (như các vấn đề xác nhận)?
Xeoncross

1
@Xeoncross nhấp vào liên kết trên từ error, trang của Google đưa ra ví dụ về điều này
MI Wright

@Xeoncross Bạn có thể trả về danh sách các lỗi khi sử dụng error.errors [], được định nghĩa là: "Container cho bất kỳ thông tin bổ sung nào liên quan đến lỗi. Nếu dịch vụ trả về nhiều lỗi, mỗi phần tử trong mảng lỗi biểu thị một lỗi khác nhau." Có lẽ lỗi cấp cao nhất sẽ đề cập đến "Yêu cầu xác thực đầu vào không thành công" và mảng lỗi [] sẽ có một mục nhập cho mỗi lỗi xác thực cụ thể xảy ra.
James hàng ngày

130

Tôi đoán một tiêu chuẩn defacto chưa thực sự xuất hiện (và có thể không bao giờ). Nhưng bất kể, đây là mất của tôi:

Yêu cầu thành công:

{
  "status": "success",
  "data": {
    /* Application-specific data would go here. */
  },
  "message": null /* Or optional success message */
}

Yêu cầu thất bại:

{
  "status": "error",
  "data": null, /* or optional error payload */
  "message": "Error xyz has occurred"
}

Ưu điểm: Các yếu tố cấp cao nhất giống nhau trong cả trường hợp thành công và lỗi

Nhược điểm: Không có mã lỗi, nhưng nếu bạn muốn, bạn có thể thay đổi trạng thái thành mã (thành công hay thất bại), hoặc - bạn có thể thêm một mục cấp cao nhất khác có tên là "mã".


3
vâng, đây là cách đúng đắn nếu bạn đang sử dụng POJO để phân tích cú pháp json! Khi chúng tôi đang sử dụng POJO, chúng tôi cần định dạng json tĩnh, không động!
LOGiah

Ngắn gọn và đúng trọng tâm. Theo tôi thì tốt hơn jsend vì jsend phân biệt lỗi với thất bại.
Josue Alexander Ibarra

1
Tôi cũng sử dụng mẫu này nhưng với một trường được gọi messageslà một mảng các thông điệp thay vì một chuỗi.
StockBreak

4
Câu trả lời gần như là một bản sao của tài liệu JSend rất đơn giản và rất hữu ích. Họ đã cung cấp trạng thái thứ ba failcho các vấn đề xác nhận điển hình, trong khi errorchỉ được sử dụng với các lỗi nghiêm trọng như lỗi db.
s3m3n

cho sự thành công: nếu nó có 200trong các tiêu đề tại sao bạn thậm chí cần một statuslĩnh vực? chỉ cần trả lại đối tượng dữ liệu thẳng. Bạn biết điều này có thể gây thêm đau đớn với các ngôn ngữ FE được gõ như TypeScript.
Deniss M.

84

Giả sử câu hỏi của bạn là về thiết kế dịch vụ web REST và chính xác hơn là liên quan đến thành công / lỗi.

Tôi nghĩ có 3 loại thiết kế khác nhau.

  1. Chỉ sử dụng mã Trạng thái HTTP để cho biết nếu có lỗi và cố gắng giới hạn bản thân ở các tiêu chuẩn (thường là đủ).

    • Ưu điểm: Nó là một tiêu chuẩn độc lập với api của bạn.
    • Nhược điểm: Ít thông tin về những gì thực sự đã xảy ra.
  2. Sử dụng HTTP Status + json body (ngay cả khi đó là lỗi). Xác định cấu trúc thống nhất cho các lỗi (ví dụ: mã, thông báo, lý do, loại, v.v.) và sử dụng nó cho các lỗi, nếu thành công thì chỉ cần trả về phản hồi json dự kiến.

    • Ưu điểm: Vẫn là tiêu chuẩn khi bạn sử dụng mã trạng thái HTTP hiện có và bạn trả về một json mô tả lỗi (bạn cung cấp thêm thông tin về những gì đã xảy ra).
    • Nhược điểm: json đầu ra sẽ thay đổi tùy theo nếu đó là lỗi hay thành công.
  3. Quên trạng thái http (ví dụ: luôn là trạng thái 200), luôn sử dụng json và thêm vào thư mục gốc của phản hồi boolean và một đối tượng lỗi (mã, thông báo, v.v.) sẽ được đưa ra nếu đó là lỗi nếu không các trường khác (thành công) được dân cư.

    • Ưu điểm: Máy khách chỉ xử lý phần thân của phản hồi là chuỗi json và bỏ qua trạng thái (?).

    • Nhược điểm: Tiêu chuẩn ít hơn.

Tùy bạn chọn :)

Tùy thuộc vào API, tôi sẽ chọn 2 hoặc 3 (tôi thích 2 cho json rest apis). Một điều khác tôi đã có kinh nghiệm trong việc thiết kế REST Api là tầm quan trọng của tài liệu cho từng tài nguyên (url): các tham số, phần thân, phản hồi, các tiêu đề, v.v.

Tôi cũng khuyên bạn nên sử dụng jersey (triển khai jax -rs) + genson (thư viện dữ liệu java / json). Bạn chỉ phải thả genson + jersey trong classpath của bạn và json được tự động hỗ trợ.

BIÊN TẬP:

  • Giải pháp 2 là khó thực hiện nhất nhưng ưu điểm là bạn có thể xử lý các trường hợp ngoại lệ một cách độc đáo và không chỉ các lỗi kinh doanh, nỗ lực ban đầu quan trọng hơn nhưng bạn sẽ giành chiến thắng trong dài hạn.

  • Giải pháp 3 là dễ thực hiện trên cả hai mặt, máy chủ và máy khách nhưng nó không đẹp lắm vì bạn sẽ phải gói gọn các đối tượng bạn muốn trả về trong một đối tượng phản hồi có chứa lỗi answerValid +.


2
Bạn nói rằng tôi nên "Xác định cấu trúc thống nhất cho các lỗi" và các đề xuất tương tự khác, nhưng đây chính xác là những gì tôi đang hỏi về. Tôi đoán câu trả lời hóa ra là "không, không có thực tiễn tiêu chuẩn hoặc tốt nhất liên quan đến cấu trúc này."
FtDRbwLXw6

7
Đối với bản ghi: mã trạng thái HTTP không phải là tiêu đề.
pepkin88

3
"phản hồi sẽ không phải là json mà là html." Sai lầm! html không có gì để xử lý lỗi. phản hồi có thể là bất cứ loại nội dung nào bạn hỗ trợ.
oligofren

2
@ レ code Mã trạng thái HTTP là mã gồm 3 chữ số trong dòng trạng thái của tiêu đề của phản hồi HTTP. Theo sau dòng đó là các trường tiêu đề, thông thường cũng được gọi là tiêu đề.
pepkin88

1
@アレックスCác trang Wikipedia trên HTTP độc đáo trả lời câu hỏi của bạn, bạn có thể kiểm tra xem nó có: en.wikipedia.org/wiki/... (liên kết đến thông điệp phần Response)
pepkin88


19

Sau đây là định dạng json instagram đang sử dụng

{
    "meta": {
         "error_type": "OAuthException",
         "code": 400,
         "error_message": "..."
    }
    "data": {
         ...
    },
    "pagination": {
         "next_url": "...",
         "next_max_id": "13872296"
    }
}

19

Tôi sẽ không kiêu ngạo khi tuyên bố rằng đây là một tiêu chuẩn nên tôi sẽ sử dụng mẫu "Tôi thích".

Tôi thích phản hồi ngắn gọn hơn (khi yêu cầu một danh sách / bài viết tôi muốn một mảng bài viết JSON).

Trong các thiết kế của tôi, tôi sử dụng HTTP cho báo cáo trạng thái, 200 chỉ trả về tải trọng.

400 trả về một thông báo về những gì sai với yêu cầu:

{"message" : "Missing parameter: 'param'"}

Trả về 404 nếu mô hình / trình điều khiển / URI không tồn tại

Nếu có lỗi khi xử lý về phía tôi, tôi trả về 501 với một thông báo:

{"message" : "Could not connect to data store."}

Từ những gì tôi đã thấy khá nhiều khung REST-ish có xu hướng nằm dọc theo các dòng này.

Cơ sở lý luận :

JSON được coi là một định dạng tải trọng , nó không phải là một giao thức phiên. Toàn bộ ý tưởng về tải trọng phiên phiên dài đến từ thế giới XML / SOAP và các lựa chọn sai lầm khác nhau đã tạo ra các thiết kế cồng kềnh đó. Sau khi chúng tôi nhận ra tất cả điều đó là một vấn đề đau đầu, toàn bộ quan điểm của REST / JSON là KIẾM nó và tuân thủ HTTP. Tôi không nghĩ rằng có bất kỳ tiêu chuẩn từ xa nào trong cả JSend và đặc biệt là không có nhiều chi tiết hơn trong số đó. XHR sẽ phản ứng với phản hồi HTTP, nếu bạn sử dụng jQuery cho AJAX của mình (giống như hầu hết), bạn có thể sử dụng try/ catchdone()/ fail()gọi lại để ghi lại lỗi. Tôi không thể thấy cách đóng gói các báo cáo trạng thái trong JSON hữu ích hơn thế.


2
"JSON là định dạng tải trọng ...". Không, JSON là một định dạng tuần tự hóa dữ liệu. Bạn có thể sử dụng nó để truyền tải bất cứ thứ gì bạn muốn, bao gồm các giao thức phiên hoặc chỉ là các tải trọng đơn giản. Nhận xét KISS của bạn là mục tiêu mặc dù và độc lập với JSON. Tốt hơn là giữ cho JSON tập trung vào nó là gì (dữ liệu thành công hoặc dữ liệu lý do thất bại như bạn mô tả) hơn là gây ô nhiễm với một số lỗi không liên tục được tạo ra và sau đó bị loại bỏ. Sau đó, bạn có thể đi tất cả các cách và lưu trữ dữ liệu JSON của bạn như trong Couchbase và trả lại dữ liệu đó cho ứng dụng.
Dirk Bester

1
Có lẽ tôi nên đặt nó là "định dạng tải trọng", nhưng ngoài ra, tôi đứng trước nhận xét của mình. Bạn có thể đặt dữ liệu phiên / lỗi làm thuộc tính của thẻ body trong tài liệu HTML, nhưng điều đó không làm cho nó trở thành cách hợp lý hoặc hợp lý để làm điều đó.
Bojan Markovic

16

Đối với những gì nó có giá trị tôi làm điều này khác nhau. Một cuộc gọi thành công chỉ có các đối tượng JSON. Tôi không cần một đối tượng JSON cấp cao hơn có chứa trường thành công cho biết trường thực và trường tải có đối tượng JSON. Tôi chỉ trả về đối tượng JSON thích hợp với 200 hoặc bất cứ điều gì phù hợp trong phạm vi 200 cho trạng thái HTTP trong tiêu đề.

Tuy nhiên, nếu có lỗi (một cái gì đó trong họ 400), tôi trả về một đối tượng lỗi JSON được định dạng tốt. Ví dụ: nếu khách hàng đang ĐĂNG người dùng có địa chỉ email và số điện thoại và một trong số đó không đúng định dạng (nghĩa là tôi không thể chèn nó vào cơ sở dữ liệu cơ bản của mình), tôi sẽ trả lại một cái gì đó như sau:

{
  "description" : "Validation Failed"
  "errors" : [ {
    "field" : "phoneNumber",
    "message" : "Invalid phone number."
  } ],
}

Các bit quan trọng ở đây là thuộc tính "trường" phải khớp chính xác với trường JSON không thể xác thực. Điều này cho phép khách hàng biết chính xác những gì đã sai với yêu cầu của họ. Ngoài ra, "tin nhắn" nằm trong miền địa phương của yêu cầu. Nếu cả "emailAddress" và "phoneNumber" đều không hợp lệ thì mảng "lỗi" sẽ chứa các mục nhập cho cả hai. Phần thân phản hồi JSON 409 (Xung đột) có thể trông như thế này:

{
  "description" : "Already Exists"
  "errors" : [ {
    "field" : "phoneNumber",
    "message" : "Phone number already exists for another user."
  } ],
}

Với mã trạng thái HTTP và JSON này, máy khách có tất cả những gì họ cần để phản hồi lỗi theo cách xác định và nó không tạo ra một tiêu chuẩn lỗi mới cố gắng hoàn thành thay thế mã trạng thái HTTP. Lưu ý, những điều này chỉ xảy ra trong phạm vi 400 lỗi. Đối với bất cứ điều gì trong phạm vi 200 tôi chỉ có thể trả lại bất cứ điều gì là phù hợp. Đối với tôi nó thường là một đối tượng JSON giống HAL nhưng điều đó không thực sự quan trọng ở đây.

Một điều tôi nghĩ về việc thêm là một mã lỗi số trong các mục mảng "lỗi" hoặc gốc của chính đối tượng JSON. Nhưng cho đến nay chúng tôi không cần nó.


9

Họ không đồng ý về các định dạng phản hồi api còn lại của các đại gia phần mềm lớn - Google, Facebook, Twitter, Amazon và những người khác, mặc dù nhiều liên kết đã được cung cấp trong các câu trả lời ở trên, trong đó một số người đã cố gắng chuẩn hóa định dạng phản hồi.

Do nhu cầu của API có thể khác nhau, rất khó để đưa mọi người lên tàu và đồng ý với một số định dạng. Nếu bạn có hàng triệu người dùng sử dụng API của mình, tại sao bạn lại thay đổi định dạng phản hồi của mình?

Sau đây là nhận định của tôi về định dạng phản hồi được lấy cảm hứng từ Google, Twitter, Amazon và một số bài đăng trên internet:

https://github.com/adnan-kamili/rest-api-response-format

Tập tin vênh vang:

https://github.com/adnan-kamili/swagger-sample-template


1
upvote cho định dạng api-api-
respons

@adnan kamilli - >>> StatusCode: 304, ReasonPhotto: 'Chưa được sửa đổi', Phiên bản: 1.1, Nội dung: <null>, Tiêu đề: {} <<<< đây có phải là phản hồi thích hợp của restApi không?
Arnold Brown

@ArnoldBrown Đối với điểm cuối API - hành động nào bạn sẽ trả lại mã này?
adnan kamili

đó là phản hồi trả lời của api được sử dụng để tải lên hình ảnh (dữ liệu biểu mẫu) - Ứng dụng khách viết bằng văn bản.
Arnold Brown

7

Điểm của JSON là nó hoàn toàn năng động và linh hoạt. Bẻ cong nó thành bất cứ điều gì bạn muốn, bởi vì nó chỉ là một tập hợp các đối tượng và mảng JavaScript được tuần tự hóa, bắt nguồn từ một nút duy nhất.

Loại rootnode là tùy thuộc vào bạn, nó chứa gì tùy thuộc vào bạn, bạn có gửi siêu dữ liệu cùng với phản hồi hay không, tùy thuộc vào việc bạn đặt loại mime thành application/jsonhay để nó tùy text/plainthuộc vào bạn ( miễn là bạn biết cách xử lý các trường hợp cạnh).

Xây dựng một lược đồ nhẹ mà bạn thích.
Cá nhân, tôi đã thấy rằng phục vụ theo dõi phân tích và phục vụ mp3 / ogg và thư viện hình ảnh và nhắn tin văn bản và các gói mạng để chơi trò chơi trực tuyến, và các bài đăng trên blog và nhận xét blog đềunhững yêu cầu rất khác nhau về những gì gửi và những gì nhận được và làm thế nào chúng nên được tiêu thụ.

Vì vậy, điều cuối cùng tôi muốn, khi làm tất cả những điều đó, là cố gắng làm cho mỗi cái phù hợp với cùng một tiêu chuẩn soạn sẵn, dựa trên XML2.0 hoặc somesuch.

Điều đó nói rằng, có rất nhiều điều để nói về việc sử dụng các lược đồ có ý nghĩa với bạn và được suy nghĩ kỹ.
Chỉ cần đọc một số phản hồi API, lưu ý những gì bạn thích, chỉ trích những gì bạn không, viết những lời chỉ trích đó và hiểu lý do tại sao họ chà xát sai cách và sau đó suy nghĩ về cách áp dụng những gì bạn đã học vào những gì bạn cần.


1
Cảm ơn bạn đã phản hồi, nhưng một lần nữa, tôi không lo lắng về bản thân trọng tải. Mặc dù tất cả các ví dụ của bạn đều có các yêu cầu rất khác nhau về những gì được gửi / nhận trong các tải trọng và cách các tải trọng đó được tiêu thụ, tất cả chúng đều phải giải quyết các vấn đề tương tự đối với chính phản hồi . Cụ thể, tất cả họ cần xác định xem yêu cầu có thành công hay không. Nếu có, tiến hành xử lý. Nếu không, điều gì đã xảy ra. Đây là bản tóm tắt chung cho tất cả các phản hồi API mà tôi đang đề cập đến trong câu hỏi của mình.
FtDRbwLXw6

Trả về trạng thái 200 cho tất cả mọi thứ và tự xác định một trọng tải lỗi cụ thể hoặc trả lại trạng thái tương xứng với lỗi, có và / hoặc không có thêm chi tiết trong phần thân của tải trọng (nếu được hỗ trợ). Giống như tôi đã nói, lược đồ là tùy thuộc vào bạn - bao gồm mọi thông tin về meta / trạng thái. Đó là một bản trống 100% để làm với những gì bạn vui lòng dựa trên phong cách kiến ​​trúc ưa thích của bạn.
Norguard

2
Tôi nhận ra rằng đó là một bản trống để làm theo ý tôi. Mục đích của câu hỏi của tôi là hỏi xem có bất kỳ tiêu chuẩn mới nổi nào về cấu trúc không. Tôi không hỏi "JSON là gì và tôi sử dụng nó như thế nào", mà là "Tôi biết cách sử dụng JSON để trả về / cấu trúc bất cứ thứ gì tôi muốn, nhưng tôi muốn biết liệu có bất kỳ cấu trúc tiêu chuẩn nào đang được sử dụng hay không Trở nên phổ biến." Tôi xin lỗi nếu tôi viết sai câu hỏi. Cảm ơn phản hồi của bạn, dù sao.
FtDRbwLXw6

7

JSON-RPC 2.0 định nghĩa một định dạng yêu cầu và phản hồi tiêu chuẩn và là một luồng gió mới sau khi làm việc với các API REST.


Điều duy nhất JSON-RPC_2.0 cung cấp cho các ngoại lệ là mã lỗi? Mã lỗi số không thể biểu thị với bất kỳ sự trung thực nào xảy ra sự cố.
AgilePro

@AgilePro Đồng ý, mã lỗi số không đẹp lắm và tôi ước các tác giả của thông số kỹ thuật đã cho phép codetrường là Chuỗi. May mắn là thông số kỹ thuật cho phép chúng tôi nhồi bất cứ thông tin nào chúng tôi muốn vào trường của lỗi data. Trong các dự án JSON-RPC của tôi, tôi thường sử dụng một mã số duy nhất cho tất cả các lỗi của lớp ứng dụng (trái ngược với một trong các lỗi giao thức chuẩn). Sau đó, tôi đặt thông tin lỗi chi tiết (bao gồm mã chuỗi cho biết loại lỗi thực sự) trong datatrường.
dnault

2

Đối với những người đến sau, ngoài câu trả lời được chấp nhận bao gồm API HAL, JSend và JSON, tôi sẽ thêm một vài thông số kỹ thuật khác đáng để xem xét:

  • JSON-LD , là Khuyến nghị của W3C và chỉ định cách xây dựng các Dịch vụ web có thể tương tác trong JSON
  • Loại Hypermedia dành cho REST, tự nhận là "loại hypermedia dựa trên JSON đơn giản và trực quan cho REST"

1

Khung cơ bản được đề xuất có vẻ ổn, nhưng đối tượng lỗi như được định nghĩa là quá hạn chế. Người ta thường không thể sử dụng một giá trị duy nhất để diễn đạt vấn đề, và thay vào đó là một chuỗi các vấn đề và nguyên nhân là cần thiết .

Tôi đã làm một nghiên cứu nhỏ và thấy rằng định dạng phổ biến nhất để trả về lỗi (ngoại lệ) là một cấu trúc của hình thức này:

{
   "success": false,
   "error": {
      "code": "400",
      "message": "main error message here",
      "target": "approx what the error came from",
      "details": [
         {
            "code": "23-098a",
            "message": "Disk drive has frozen up again.  It needs to be replaced",
            "target": "not sure what the target is"
         }
      ],
      "innererror": {
         "trace": [ ... ],
         "context": [ ... ]
      }
   }
}

Đây là định dạng được đề xuất bởi tiêu chuẩn dữ liệu OASIS OASIS OData và dường như là tùy chọn tiêu chuẩn nhất hiện có, tuy nhiên dường như không có tỷ lệ chấp nhận cao của bất kỳ tiêu chuẩn nào tại thời điểm này. Định dạng này phù hợp với đặc tả JSON-RPC.

Bạn có thể tìm thấy thư viện mã nguồn mở hoàn chỉnh thực hiện điều này tại: Mendocino JSON Utility . Thư viện này hỗ trợ các Đối tượng JSON cũng như các ngoại lệ.

Các chi tiết được thảo luận trong bài đăng trên blog của tôi về Xử lý lỗi trong API JSON REST


0

Không có vi phạm pháp luật hoặc tiêu chuẩn ngoài vòng pháp luật ngoài ý nghĩa thông thường. Nếu chúng ta trừu tượng điều này giống như hai người nói chuyện, tiêu chuẩn là cách tốt nhất để họ có thể hiểu chính xác lẫn nhau bằng những từ tối thiểu trong thời gian tối thiểu. Trong trường hợp của chúng tôi, 'từ tối thiểu' là tối ưu hóa băng thông cho hiệu quả vận chuyển và 'hiểu chính xác' là cấu trúc cho hiệu quả của trình phân tích cú pháp; mà cuối cùng kết thúc với dữ liệu càng ít và cấu trúc chung; để nó có thể đi qua một lỗ pin và có thể được phân tích cú pháp thông qua một phạm vi chung (ít nhất là ban đầu).

Hầu như trong mọi trường hợp được đề xuất, tôi thấy các phản hồi riêng biệt cho kịch bản 'Thành công' và 'Lỗi', đây là loại mơ hồ đối với tôi. Nếu hai câu trả lời khác nhau trong hai trường hợp này, thì tại sao chúng ta thực sự cần đặt cờ 'Thành công' ở đó? Không rõ ràng rằng sự vắng mặt của 'Lỗi' là 'Thành công'? Có thể có phản hồi trong đó 'Thành công' là TRUE với bộ 'Lỗi' không? Hoặc theo cách, 'Thành công' là SAI không có 'Lỗi' được đặt? Chỉ một lá cờ là không đủ? Tôi chỉ muốn có cờ 'Lỗi', vì tôi tin rằng sẽ có ít 'Lỗi' hơn 'Thành công'.

Ngoài ra, chúng ta có nên thực sự biến 'Lỗi' thành cờ không? Nếu tôi muốn phản hồi với nhiều lỗi xác nhận thì sao? Vì vậy, tôi thấy hiệu quả hơn khi có nút 'Lỗi' với mỗi lỗi là con của nút đó; trong đó một nút trống (được tính bằng 0) sẽ báo hiệu 'Thành công'.


-2

Phản hồi tốt nhất cho apis web có thể dễ dàng hiểu được bởi các nhà phát triển di động.

Đây là phản hồi "Thành công"

{  
   "ReturnCode":"1",
   "ReturnMsg":"Successfull Transaction",
   "ReturnValue":"",
   "Data":{  
      "EmployeeName":"Admin",
      "EmployeeID":1
   }
}

Đây là phản hồi "Lỗi"

{
    "ReturnCode": "4",
    "ReturnMsg": "Invalid Username and Password",
    "ReturnValue": "",
    "Data": {}
}

2
Nó sẽ là tốt hơn để tiêu chuẩn hóa tài sản của bạn. Chúng đều là các giá trị "Trả về ...". Nhưng dữ liệu không phải là tiền tố. Tôi muốn nói, bỏ tất cả các tiền tố "Trả về".
z0mbi3

Bao gồm cả "Trả lại" cũng khá dư thừa.
Jack Marchetti
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.