2012-05-27 35 views
13

Chúng tôi đang thiết kế một API REST khá phức tạp, trong đó hầu hết các I/O là các đối tượng được mã hóa JSON với một cấu trúc cụ thể. Một thách thức mà chúng tôi đã tìm thấy là ghi lại API theo cách sao cho khách hàng dễ dàng đăng thông tin đầu vào và đầu ra quá trình chính xác hơn. Bởi vì dữ liệu của cả đầu vào và đầu ra yêu cầu các đối tượng JSON khá phức tạp, các nhà phát triển ứng dụng khách thường giới thiệu các lỗi liên quan đến cấu trúc của các đối tượng I/O.IDL cho giao diện REST/RPC JSON

Với tất cả các API web JSON của những ngày này, tôi đã hy vọng cho một giải pháp chung, nhưng tôi đang gặp khó khăn trong việc tìm kiếm một giải pháp. Tôi nhìn vào json-schema là một lược đồ xác thực json nhưng cả bản thảo và triển khai IETF dường như khá non nớt (mặc dù chúng đã tồn tại một thời gian, đó không phải là một dấu hiệu tốt).

Cách tiếp cận hơi khác được cung cấp bởi Protocol BuffersApache Avro, trong đó giản đồ không được sử dụng để xác thực, nhưng thực sự bắt buộc đối với việc mã hóa/giải mã thông báo. Trong số 2, Avro dường như có tài liệu và triển khai khá hạn chế. ProtoBuf có vẻ tốt hơn, nhưng tôi không chắc liệu điều này có thực sự phù hợp để sử dụng trong trình duyệt để gọi một JSON api không?

Bây giờ tôi bắt đầu nghi ngờ nếu tôi nhìn vào điều này từ góc bên phải. Có phương pháp nào khác để làm cho API của tôi trở nên mạnh mẽ hơn một chút không? Hay là một mô tả chính thức về một API REST REST/RPC JSON, cái gì đó đánh bại mục đích sử dụng JSON?

Chỉnh sửa: 6 tháng sau chủ đề này, chúng tôi tìm thấy mongoose, rất gần với những gì chúng tôi đang tìm kiếm.

+0

Nếu bạn thực sự cần sử dụng giải pháp hiện có, tôi sẽ chỉ sử dụng lược đồ json, có vẻ dễ sử dụng. Nếu không, tôi không nghĩ rằng quá khó để tự kiểm tra cấu trúc JSON - hãy kiểm tra xem mỗi đối tượng có thuộc tính bạn cần hay không và thực hiện điều đó một cách đệ quy nếu bạn có. Không giống như XML, JSON khá đơn giản để xác thực, đó có thể là lý do tại sao không có giải pháp xác thực hợp lệ lược đồ nào tồn tại. –

Trả lời

5

Dưới thư trả lời tôi nhận được qua email từ Douglas Crockford.

Tôi không tin tưởng vào các lược đồ thay thế cho xác thực đầu vào. Có các thuộc tính không thể được xác minh từ cú pháp. Tôi nghĩ rằng đó là một trong những cách mà XML đã đi sai.

Nếu định dạng của bạn quá phức tạp, thì tôi sẽ xem xét đơn giản hóa chúng.

0

Tôi muốn nói câu trả lời cho câu hỏi cuối cùng của bạn là có. Nếu bạn cần một cách để hạn chế và ghi lại "lược đồ" JSON, tại sao bạn không đi với XML ngay từ đầu? Nó không phải là khó hơn nhiều để phân tích cú pháp, và có thể thực thi một lược đồ cho nó là một lợi thế lớn.

2

XML tốt hơn cho các dịch vụ RESTful theo nhiều cách. Nó có liên kết gốc (<link href=, cho tất cả những người hâm mộ HATEOAS), hỗ trợ ngôn ngữ bản địa (lang="en") và một hệ sinh thái tuyệt vời.

Nó cũng tốt hơn cho việc kiểm tra tương lai và tái cấu trúc API trong tương lai. Chuyển đổi này:

<profile> 
    <username>alganet</username> 
</profile> 

Để hỗ trợ nhiều tên người dùng:

<profile> 
    <username>alganet</username> 
    <username>alexandre</username> 
</profile> 

là nhiều hơn nữa đơn giản hơn để làm mà không vi phạm khách hàng hiện tại sử dụng XML. JSON là khó khăn về điều đó.

Nếu bạn thực sự cần JSON, JSON-Schema là con đường để đi. Nó chưa trưởng thành, nhưng tôi không biết gì tốt hơn trong trường hợp đó.Có thể người tiêu dùng của bạn có thể chọn giữa XML và JSON, để họ có thể chọn giữa một tải trọng nhỏ (JSON) hoặc kẹo RESTful (XML) bằng cách sử dụng Thương lượng nội dung.

3

Hệ thống như vậy tồn tại và tôi là tác giả của một trong số chúng. Nó được gọi là Piqi-RPC và xác thực dựa trên IDL của các tham số đầu vào và đầu ra cho các API kiểu RPC qua HTTP.

Nó hỗ trợ JSON, XML và Google Protocol Buffers làm định dạng biểu diễn dữ liệu cho đầu vào và đầu ra của các yêu cầu HTTP POST. Khách hàng có thể chọn sử dụng bất kỳ định dạng nào trong số ba định dạng này và chỉ định lựa chọn của họ bằng cách sử dụng tiêu đề HTTP tiêu chuẩn AcceptContent-Type HTTP.

Vì vậy, vâng, theo lý thuyết, bạn đang tìm đúng hướng. Tuy nhiên, tại thời điểm này, Piqi-RPC chỉ hỗ trợ viết các máy chủ trong Erlang và nó sẽ không hữu ích cho bạn nếu bạn sử dụng một ngăn xếp khác. Tôi nghe nói rằng Apache tiết kiệm cũng hỗ trợ JSON qua giao thông HTTP, nhưng tôi đã không kiểm tra. Một loại hệ thống tương tự mà tôi biết (cũng cho Erlang) được gọi là UBF. Tôi đã nghe nói về các thư viện cho Java có thể phân tích và xác thực JSON dựa trên đặc điểm kỹ thuật của Protocol Buffers (ví dụ: http://code.google.com/p/protostuff/).

Ý tưởng bản thân không xa mới, nhưng không có nhiều hệ thống tiếp cận nó trong thực tế. Đây là một vấn đề khó khăn.

Trước đây, IDL được sử dụng để định nghĩa giao diện và tuần tự hóa dữ liệu nhị phân và không quá nhiều để xác thực định dạng trao đổi dữ liệu động (ví dụ: XML và JSON). Sun-RPC IDL và Corba IDL nằm trong danh mục đầu tiên. WSDL sẽ là một trong số ít ví dụ bao gồm cả hai lĩnh vực, nhưng nó là một công nghệ khủng khiếp và nó sẽ là một lựa chọn tồi cho hầu hết các hệ thống hiện đại. Ngoài ra, có nhiều ngôn ngữ lược đồ (còn được gọi là DDLs - ngôn ngữ định nghĩa dữ liệu), hầu hết trong số đó đều có tính chuyên môn cao và chỉ hoạt động với một định dạng biểu diễn, ví dụ: Lược đồ XML hoặc JSON. Rất ít trong số đó có triển khai ổn định.

Các Piqi-RPC Piqi project và, mà là dựa vào nó, được xây dựng xung quanh một vài ngộ khá đơn giản:

  • DLL không nhất thiết phải được gắn một cách rõ ràng với bất kỳ định dạng biểu diễn dữ liệu cụ thể hoặc xây dựng xung quanh nó. Thay vào đó, ngôn ngữ đó có thể khá phổ biến và bao gồm nhiều trường hợp sử dụng thực tế (ví dụ: tuần tự hóa dữ liệu chéo và xác thực dữ liệu) và định dạng dữ liệu (ví dụ: JSON, XML, Bộ đệm giao thức).

  • IDL cho giao tiếp kiểu RPC có thể được triển khai dưới dạng lớp mỏng, chủ yếu là cú pháp trên đầu DDL phổ quát.

  • IDL và thông số giao diện như vậy có thể vận chuyển bất khả tri.

Phát biểu của API kiểu REST qua HTTP so với API kiểu RPC qua HTTP.

Với API kiểu RPC, nhà phát triển dịch vụ hoặc hệ thống tự động phải xác thực ba điều: tên hàm (theo một sơ đồ đặt tên dịch vụ), đầu vào và, nếu bạn chọn, đầu ra.

Trong trường hợp API kiểu REST, mọi người gặp rắc rối vì không có lý do chính đáng. Bây giờ, họ có thêm nhiều thứ hơn để xác thực: cú pháp URL phức tạp tùy ý, bao gồm các thông số động được mã hóa trong phân đoạn URL (cho tất cả phương thức HTTP) và chuỗi truy vấn URL (chỉ cho phương thức HTTP GET), tương ứng với phương thức HTTP GET, POST, PUT, DELETE, v.v.), HTTP body khi một số tham số xuất hiện (đôi khi chúng thực hiện thủ công hai lần đối với các tham số được biểu diễn bằng JSON và XML), tiêu đề HTTP tùy chỉnh và tài liệu dịch vụ riêng biệt. Hãy tưởng tượng một IDL hỗ trợ tất cả những điều đó!