2013-03-06 24 views
18

Sunucu tarafında web geliştirme konusunda yeniyim ve son zamanlarda RESTful API'leri uygulama konusunda çok şey okudum. REST API'sinin hala üzerinde durduğum bir yönü, istemcinin etkileşimde bulunabileceği kaynakları tanımlayan URI hiyerarşisini yapılandırmaktır. Özellikle hiyerarşinin ne kadar ayrıntılı yapılması gerektiğine ve diğer kaynak türlerinden oluşan kaynaklarda ne yapılacağına karar vermek üzereyim.REST kaynak hiyerarşisini nasıl yapılandırabilirim?

İşte ne demek istediğimi umarım gösterecek bir örnek. Kullanıcıların diğer kullanıcılardan ürün satın almasını sağlayan bir web servisimiz olduğunu düşünün. Bu durumda, iki üst düzey kaynak kullanıcıları ve ürünleri ürünleri vardır. Her hiyerarşi referans bir alt nesneleri Bu durumların her ikisinde de

/products 
     /{id} 
       /name 
       /category 
       /description 
       /keywords 
       /buyer 
       /seller 

: ürünler için

/users 
     /{id} 
      /location 
      /about 
      /name 
      /seller_rating 
      /bought 
      /sold 

: İşte URI hiyerarşisi, kullanıcılar için

yapılandırmaya böyle başladı Diğer hiyerarşideki nesnelerin Örneğin, /users/{id}/bought, bir kullanıcının aldığı, /products alt kümesi olan ürünlerin bir listesidir. Ayrıca, /products/{id}/seller, belirli bir ürünü satan kullanıcıyı referans alır.

Bu URI'nin diğer nesnelere veya diğer nesnelerin alt kümelerine başvurması, API'nin şu gibi şeyleri desteklemesi gerekir: /users/{id}/bought/id/description ve /products/{id}/buyer/location? Çünkü bu tür URI'ler destekleniyorsa, bu /users/{id}/bought/{id}/buyer/bought/{id}/seller/name gibi bir şeyi ya da eşit şekilde sarsılmış bir şeyi nasıl durduracaksınız? Ayrıca, bu durumda, sunucudaki yönlendiricinin URI'leri rasgele uzunluktan yorumlaması gerektiğinden yönlendirmeyi nasıl ele alırsınız?

cevap

22

Amaç, uygun kaynak tanımlayıcıları oluşturmak, her şeyi çapraz referans yapmaya çalışmayın. Zaten bu kaynak için tanımlayıcı var, çünkü URL gösterimi :) /product/{id}/buyer gibi

Linkler var asla içinde veritabanı ilişkileri tekrarlamak zorunda değilsiniz: /user/{id}

o /product/{id}/buyers-list var Tamam olsa çünkü alıcılar listesi diğer bağlamlarda bulunmayan bir ürünün mülkiyetidir.

+0

Ee, ne diyorsunuz sistemde her kaynak tam ** birine sahip olmasıdır:

Ve Ürünleri için

, sizin sitation ben kullanırım? Çünkü bu her şeyi çok daha basitleştiriyor. Yukarıdaki örnekte, bir ürünün satıcısını api aracılığıyla göstermek istediğimde (ürünler yalnızca bir satıcınız var) ne önerirsiniz? İnsanları sadece yapmalı mıyım? GET/products/{id} * hangi JSON nesnesini satıcıyla birlikte iade edecek? – martega

+2

JSON for/products/{id} ', size kolaylık sağlamak için iç içe kullanıcı nesnesi veya bu kullanıcıya url içerebilir, bu sizin seçiminizdir ve her ikisinin de ayrı olarak var olduğu gerçeğini değiştirmez. – Anri

+3

btw, diğer hizmetlerin API'lerine bakmaya yardımcı olur. Örneğin: https://developer.foursquare.com/docs/venues/venues – Anri

11

Her varlık, oluşturma Read, Güncelleme destekleyen bir REZİL moda, içinde düşünmek ve Sil (tipik GET, POST, PUT kullanarak, sırasıyla HTTP fiilleri SİL) gerekmektedir.

Bu, uç noktalarınızın genellikle yalnızca bir seviye derinliğe ineceği anlamına gelir. Örneğin

Kullanıcılar

GET /users  - Return a list of all users (you may not want to make this publically available) 
GET /users/:id - Return the user with that id 
POST /users  - Create a new user. Return a 201 Status Code and the newly created id (if you want) 
PUT /users/:id - Update the user with that id 
DELETE /users/:id - Delete the user with that id 

gibi /users/:id/about gerekli olası değildir, daha ayrıntıya inildiğinde. İşe yarayabilirken, biraz aşırı olabilir.

Belki durumda ekleyebilirim:

GET /users/:id/bought - Array of products that the user bought 
GET /users/:id/sold - Array of products that the user sold 

sen (ürün API aracılığıyla getirilen edilebilir) id yılların listesini geri dönebilirler veya geri eğer göndermeden önce Ürünleri doldurmak nerede arzuluyorsun.Bunları doldurmayı seçerseniz, muhtemelen her bir ürün tarafından başvurulan kullanıcıları doldurmamalısınız. Bu döngü içeren ve yanlıştır. ** URI

GET /products- Return a list of all products 
GET /products/:id - Return the products with that id 
POST /products- Create a new product. Return a 201 Status Code and the newly created id (if you want) 
PUT /products/:id - Update the product with that id 
DELETE /products/:id - Delete the product with that id 

GET /products/:id/buyers  - Array of who bought the product 
GET /products/:id/sellers - Array of everyone selling the product