2013-09-25 47 views
5

Chúng tôi đang viết API không phải XML đầu tiên của chúng tôi và tôi muốn hỏi về các phương pháp hay nhất đại diện cho các tài nguyên có liên quan trên API. Hãy để tôi giải thích nó trên một tài nguyên user và tài nguyên liên quan của nó - organization.Cách giữ đại diện đồng phục FKs trong đầu vào/đầu ra (RESTful JSON API)

Trong XML này khá đơn giản:

  1. đáp ứng cơ thể (GET) - nó chứa ID tài nguyên cũng như URI:

    GET /users/321/ 
    
    <?xml version="1.0" encoding="UTF-8" ?> 
    <user> 
        <!-- ... ---> 
        <organization name="Lorem Ipsum Ltd." href="/organizations/123/">123</organization> 
    </user> 
    
  2. Yêu cầu cơ thể (POST/PUT/PATCH) - sử dụng ID:

    PATCH /users/321 
    
    ...&organization=123 
    
  3. URI lọc - sử dụng ID của tài nguyên liên quan:

    GET /users/?organization=123 
    
    <?xml version="1.0" encoding="UTF-8" ?> 
    <users> 
        <!-- ... ---> 
    </users> 
    

Bây giờ, kể từ khi JSON không sử dụng các thuộc tính, nó không phải là một 1: chuyển 1.

  1. đáp ứng cơ thể (GET):

    Thay vì sử dụng ID như các giá trị, chúng tôi chuyển sang URI để tuân thủ các nguyên tắc mối của REST:

    GET /users/321/ 
    
    { 
        ..., 
        "organization": "/organizations/123" 
    } 
    
  2. Yêu cầu nội dung (POST/PUT/PATCH) - chấp nhận URI (ví dụ không được mã hóa vì mục đích dễ đọc):

    PATCH /users/321 
    
    ...&organization=/organizations/123/ 
    
  3. URI lọc - để giữ các URI sạch, chúng tôi vẫn sử dụng ID thay vì URI khi lọc qua các tham số GET:

    GET /users/?organization=123 
    
    { 
        "users": [ 
         ... 
        ] 
    } 
    

Bit cuối cùng phá vỡ sự thống nhất về giá trị (ID so với URI) giữa yêu cầu và phản hồi, nhưng chúng tôi muốn sử dụng ID thay vì URI vì ID dễ đọc hơn và vì có thể có trường hợp chúng tôi cần đặt nhiều giá trị vào bộ lọc (ví dụ: ?organization__in=123,124).

Vì vậy, câu hỏi của tôi là, cách bạn giữ đại diện yêu cầu/phản hồi của các tài nguyên có liên quan thống nhất trên API? Bất kỳ thực hành tốt nhất, tiêu chuẩn, hoặc chỉ là ý thức chung? Hoặc có lẽ là trên một mối quan tâm không cần thiết?

Sửa: Để làm rõ, tôi hỏi về cách bạn sẽ thiết kế các API về cấu trúc URI (tham số GET) và định dạng dữ liệu request/response. Tôi là không phải hỏi về việc triển khai kỹ thuật.

Một cách tiếp cận chúng tôi là chuyển sang một biểu diễn chi tiết hơn, cung cấp cho người dùng API nhiều dữ liệu hơn một chút, nhưng vẫn không giải quyết được vấn đề đồng nhất. Ví dụ:

GET /users/321/ 

{ 
    ..., 
    "organization": { 
     "ud": 123, 
     "name": "Lorem Ipsum Ltd.", 
     "uri": "/organizations/123" 
    } 
} 

Lưu ý - câu hỏi tương tự (không trùng lặp): REST API - include related object details or just ID's

+0

Khi bạn yêu cầu tính đồng nhất, tôi có chính xác bạn có nghĩa là trên các đối tượng không? – Jeff

+0

Nếu bạn có nghĩa là _across objects_ như giữa các đối tượng có liên quan thông qua các khóa nước ngoài, sau đó có. – MicE

+0

Câu hỏi hiển thị định dạng URI cho truy vấn lọc người dùng theo tổ chức - ''/users /? Organization = 123''. Truy vấn sử dụng tổ chức _ID_ trong tham số GET, trong khi phản hồi sẽ chứa _URI_ của tổ chức được nói thay vì chỉ _ID_ của nó. Đây là sự không nhất quán mà tôi đang chỉ ra và tôi đang tìm kiếm lời khuyên về cách xử lý thông tin này - tức là giữ cho nó đồng nhất và sử dụng ID hoặc URI; hoặc đừng lo lắng về nó và trộn nó; hoặc cái gì khác. – MicE

Trả lời

0

câu hỏi thú vị và tôi thấy lợi thế của việc có một cách để làm điều này. Giao diện hoặc kế thừa sẽ không hoạt động vì tất cả những gì bạn thực sự quay trở lại là một chuỗi (hình tượng). Làm thế nào về một tập hợp những người giúp đỡ mà sẽ hành động trên một loại và xây dựng các phản ứng cho bạn? Bạn có thể vượt qua nó T và nó sẽ lặp lại thông qua các đối tượng xây dựng các phản ứng theo các quy tắc và các mẫu bạn thiết kế. Bạn có thể có một GetBuilder (x) và nó sẽ được gọi từ Get của bạn. Điều này cung cấp một vị trí duy nhất cho việc xử lý các lợi nhuận và cung cấp tính đồng nhất.

+0

Tôi xin lỗi, bạn đã hiểu lầm - hãy xem trả lời của tôi về nhận xét ban đầu của bạn. Tôi hỏi về cấu trúc và định dạng dữ liệu URI, không phải là nền tảng kỹ thuật (mà bạn đang phát hiện ra, đó không phải là những gì tôi đã hỏi). – MicE

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