2012-04-13 21 views
6

Şu anda dahili bir REST API'si tasarlıyoruz. Bir kullanıcı (109) diye başka bir kullanıcıya gönderdiğini mesajını okumak istiyor REST API tasarımı - posta verilerini sorgular - hangi zehir seçilir?

  1. (110)
  2. okuma kullanıcıyı (109) onun belirteci ile app bilinmektedir: Biz aşağıdaki kullanım durum var kimlik bilgileri kullanım 109 gönderici ve 110

kullanıcılar açısından özetlemek alıcı oldu bu örnekte varsayalım

  • (GET isteği yaparken) o kimlik doğrulaması sonra aldığı "bana posta vermek i (109) 110 "

    adresine gönderilmiştir. will

    a) GET http://localhost:9099/api/mails/109?receiverUserId=110 
    b) GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110 
    c) GET http://localhost:9099/api/mails?receiverUserId=110 
    d) GET http://localhost:9099/api/mails/me/to/110 (when logged in as 109 via token credentials we know that "me" is 109) 
    f) GET http://localhost:9099/api/mails/109/to/110 (explicit request, e.g. for admins … has to be guarded against illegal access) 
    

    tüm bağlantıları alıcı (110) için bağlantılardan birini gönderiyor "bağlam duyarlı" şunlardır:

    aşağıdaki URI'ları aklımıza geldi ama biz almaya hangisinin karar veremez GET isteğini yürüten farklı sonuçlar verir.

    Kullanmak istediğiniz url hakkındaki düşüncelerinizi öğrenmek istiyorum. Herhangi bir yardım için teşekkür ederiz.

    şerefe aynı URL için farklı müşterilere

  • +0

    Sadece bir gözlem: (b) ve (d) aynıdır. – ArjunShankar

    +0

    ah üzgünüm, haklısın ;-) – Marcel

    +1

    c için oy veriyorum. Bilindiği gibi okuma kullanıcısını gösteren noktayı göremiyorum. (Önbelleğe almayı hariç) – njzk2

    cevap

    2

    Farklı tepkiler marcel, tamamdır.

    Stack Exchange yapar:

    GET /me/comments/{toid} 
    

    here belgelenmiştir hangi.

    Heyecan de bunu yapar:

    GET /statuses/home_timeline 
    

    here belgelenmiştir hangi.

    Bu URL'lerin her ikisi de kimlik doğrulaması temelinde oturum açmış kullanıcıyı bulur. Evet, kullanıcılar önbelleği paylaşırsa, ancak IMO'yu önbelleğe alır, bu iyi olur. Bunun, REST'in 'kaynak tanımlaması' kısıtlamasını ihlal edip etmediği muhtemelen tartışmalıdır. this sorusunun cevabı ve bir sonraki yorum bana neden tartışmalı olduğunu gösteriyor.

    Aslında, seçenekler arasında, sen 'duyarlı bağlam' değildir söz URL'ler yapmak :

    GET /api/mails?senderUserId=109&receiverUserId=110 
    

    hep 109 den 110'a Ama mesajlar dönecektir Bu bire bir müşteri isteyeyim iken 'gönderilen' mesajları görüntülerken bu sonuca bakın, diğeri 'alınan' mesajları görüntülerken bu sonucu görmek ister. Tuhaf bir şey mi? Ayrıca, sunucuda kimliği doğrulanmış kullanıcının 109 | 110 olduğunu kontrol etmeniz gerekir, aksi takdirde 401 UNAUTHORIZED.

    GET /mail/sent 
    

    getiri tüm gönderilen posta:

    Ben böyle bir şeyle gider.Ve:

    GET /mail/sent?to=110 (like applying a 'filter' to /mail/sent) 
    OR 
    GET /mail/sent/110 (clean URL) 
    

    döner 110'da

    +0

    Cevabınız için teşekkürler. Verilen bağlantılardan birini seçeceğimizi düşünüyorum. – Marcel

    1

    gönderilen mail "Bağlam duyarlı" bağlantıları (özellikle bu önbelleğe engelleyen) bir DİNLENME API için kötü bir düşüncedir. Sadece HTTP kullanmak istiyorsanız, bu Tamam.

    Geçerli kullanıcılara bağlı olmayan URL'leri kullanmanızı öneririm ve kurallara göre bunlara erişimi sınırlandırır.

    Bir kullanıcı kimlik doğrulaması gerektirmeyen iç katman ise, iç bileşenlerden sadece erişilebilir: Bence

    0

    , size 2 katmanları gerekir. Bu tabakanın avantajı, test edilebilir, yeniden kullanılabilirliği ve önbelleklenebilirliğini olan

    GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110

    gibi API'leri içerir.

    Diğer katman, kullanıcı kimlik doğrulaması gerektiren ve dış istemcilerden erişilebilen dış tabakadır. Bu,

    GET http://localhost:9099/api/mails?receiverUserId=110 gibi API'leri içerir.

    Müşteriler, jeton kimlik bilgilerini almak için oturum açmalı, ardından sunucu bu simgeden kullanıcı bilgilerini alabilir ve harici API çağrısını dahili API çağrısına eşleyebilir.

    Farklı türde kimlik doğrulama yöntemleriniz olabilir, ancak iç katman değiştirilmeyecek, yalnızca farklı dış katmanları iç katmana eşlemeniz gerekiyor.