2013-08-14 9 views
19

Ich habe RESTful API innerhalb eines Web-Service mit einer Art von Ressourcen wie Benutzer, Beiträge und so weiter. Wenn ich eine Liste von Posts (GET/posts) anfordere, möchte ich ein Array von Posts nur mit einem reduzierten Teil der Daten für jeden Post (d. H. Betreff, Autorenname) abrufen. Wenn ich eine konkrete Post (GET/posts/42) anfordere, möchte ich die vollständige Liste der Post-Objektfelder abrufen, einschließlich des großen Post-Bodys, zusätzlicher Informationen über Likes count, comments count. Ich vermute, es gibt viele Möglichkeiten, dieses Problem zu lösen. In meinem Kopf, 3 naheliegendste sind:?Möglichkeit, Ressourcen Felder Liste in RESTful API Anfrage

  1. Explizit Felder lits bei jeder Anfrage angeben (/ Beiträge fileds = Thema, author_name und für /posts/42 Felder = Subjekt, Körper, createaAt, author_name, comments_count, likes_count, etc ...).
  2. Explizit Feldliste nur angeben, wenn sie von Standard Felder Liste unterscheidet.
  3. Geben Sie die Feldliste an, die ausgeschlossen werden soll (oder inlcuded) von (bis) Standardfelder, wenn die gewünschten Felder vom Standard abweichen.

Ich, was klar und nützlich API für meine Kunden zu bauen. Welchen Weg soll ich wählen?

Antwort

16

Ich würde für Option 2 IMHO gehen.

Also, wenn der Verbraucher nur die Ressource URL (/ posts/42) anfordert, erhalten sie die Standardfelder.

Dann können die Verbraucher die Standardantwort verändern, indem Werte in der Abfragezeichenfolgeflag wie definieren:/posts/42/Felder Thema, author_name

Diese in der Vergangenheit gut für mich gearbeitet hat und ist, wie einige andere auch APIs kennen Arbeit, z Facebook

Edit: Rückblickend würde ich die Anfrage zu ändern:/posts/42? Felder = Betreff, Autor_Name,/post/42 ist die Ressource nicht Felder.

+0

würde ich zustimmen. Es bietet eine niedrige Eintrittsbarriere, sodass Entwickler die Standardfelder leicht erkennen und sehen können, aber dennoch die Flexibilität haben, genau nach Ihren Wünschen zu fragen. – theon

+0

Ich mache auch Option (2), aber ich erlaube 'fields = *', alle Felder zu bekommen, so dass die Abfrage des ganzen Satzes einfach ist (besonders für einen Entwickler, der das überprüfen oder überprüfen möchte, was dieser Satz ist). –

5

Haben auch diesbezüglich Forschung und wurde auf Facebook GraphQL als eine Alternative zur Anforderung einer erholsamen API mit den gewünschten Bereichen hingewiesen. Es befindet sich noch in einem sehr frühen Stadium, scheint aber sehr vielversprechend.

https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html

EDIT: von der URL Abgebildet:

A GraphQL Abfrage eine Zeichenfolge von einem Server ausgelegt ist, die Daten in einem bestimmten Format zurückkehrt. Hier ist ein Beispiel Abfrage:

{ 
    user(id: 3500401) { 
    id, 
    name, 
    isViewerFriend, 
    profilePicture(size: 50) { 
     uri, 
     width, 
     height 
    } 
    } 
} 

(Hinweis: diese Syntax aus früheren GraphQL Beispielen etwas anders haben wir vor kurzen Verbesserungen zu machen, um die Sprache..)

Und hier ist die Antwort auf diese Abfrage.

{ 
    "user" : { 
    "id": 3500401, 
    "name": "Jing Chen", 
    "isViewerFriend": true, 
    "profilePicture": { 
     "uri": "http://someurl.cdn/pic.jpg", 
     "width": 50, 
     "height": 50 
    } 
    } 
}