2016-09-23 2 views
2

Angenommen, meine Anwendung verwaltet Objekte namens Workload mit den folgenden Feldern. Ich möchte eine REST-Schnittstelle für den Benutzer bereitstellen, um Workloads nach Labels abzufragen.Was ist eine RESTful-Methode zum Abfragen von Filtern?

"Workload": {"id":"test1", "labels":["A", "B", "C"]} 
"Workload": {"id":"test2", "labels":["A", "C", "D"]} 
"Workload": {"id":"test3", "labels":["A", "B", "D"]} 

Frage: Wie gestalte ich den REST-Endpunkt, so dass es würde Abfrageauslastung von mehr Etiketten als Filter unterstützt?

Beispiel Query 1: Ich möchte GET alle Arbeitslasten mit beiden "A" und "B".

Ich denke etwas wie GET als Verb, workloads als Endpunkt, dann verwenden Sie eine {"labels": ["A", "B"]} als Anfrage Körper. Aber das scheint nicht wie ein RESTful Weg, Dinge zu tun

Alternativ kann ich GET /labels/{label-id}/workloads tun, aber das würde nur mit einem Etikett pro Zeit arbeiten.

Beispielabfrage 2: Ich möchte GET alle Workloads mit dem Label „A“ oder „B“, aber keine „C“

Keine Ahnung, wie überhaupt diese Art von Rest api zu tun, andere als den Benutzer bitten, getrennt nach A, B, C zu fragen, dann selbst die richtigen Einstellungen vorzunehmen?

Die zweite Abfrage ist tracked as another question

+0

Ich glaube nicht, dass es etwas falsch mit Abfrageparametern ist. Gibt es einen Grund, warum du sie vermeiden willst? – mrmcgreg

+0

Ich hatte Zweifel, ob ich Abfrageparameter wiederholen möchte/kann.Da ich meine Anwendung in 'golang' programmiere, benutze ich eine [third party library'httprouter'] (https://github.com/julienschmidt/httprouter), die mir hilft, den Parameter automatisch zu parsen, der momentan nur Single unterstützt Abfrageparameter ... Dinge wie 'workload /: workload_id/labels /: label_id' – cookieisaac

Antwort

1

GET Verb nimmt nicht Körper fordern. Sie sollten etwas wie 'workload/labels/A, B, C' machen. Sie erhalten dann A, B, C in Anfrageabfrage. Erstellen Sie ein Array mit einem Komma, das von der Anforderungsabfrage getrennt ist und Datensätze findet.

+0

1. Kann ich [Komma in URL] (http://stackoverflow.com/questions/198606/cani-i-use-commas- in einer URL). 2. Wie führe ich Abfragen wie "Geben Sie mir Workloads mit dem Label" A "oder" B ", aber kein" C "in einer durch Kommas getrennten Liste aus? – cookieisaac

+0

@cookieisac Comma in URL hängt von serverseitiger Routingimplementierung ab, z. von node.js express kann man haben, bei IIS kann es zu Problemen kommen. Sie müssen es zuerst testen. – inf3rno

1

Verwenden Abfrageparameter, its fine-repeat them.

GET /workloads?label=A&label=B&label=C 

Für einfache Fälle könnten Sie auch or und not die Begriffe wie diese.

GET /workloads?or_label=A&or_label=B&label_not=C 
+1

Das sieht gut genug für meine Situation aus. Ich frage mich, ob ich verrückt werden und etwas wie 'GET/Workloads? (Label = A || Label = B) und Label! = C' machen kann? Oder gibt es auf jeden Fall einige grundlegende logische Operationen wie '(A oder B) nicht C' – cookieisaac

+0

Sie könnten versuchen, es als eine neue Frage zu veröffentlichen. Ich kann mir keine offensichtliche Lösung vorstellen. Vielleicht brauchen Sie eine andere (Menge von) Ressource (n), um Ihre Abfrage zu definieren und dann die Ergebnisse mit 'GET/queries/{id}/workloads' –

+0

http://stackoverflow.com/questions/10582066/is-that- zu erhalten. payable-to-use-in-query-Zeichenfolge –

0

Sie haben eine Menge von Optionen, die einzige Einschränkung hier, dass sie A und B enthalten sollte. So zum Beispiel

  • /workloads/?label=["A","B"]
  • /workloads/?label[]=A&label[]=B - aka. query string array
  • /workloads/by/label/A+B/
  • /label/A+B/workloads/

Es gibt bestehende URI-Abfrage Konventionen als auch, zum Beispiel Microsoft OData. http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html Ich bin nicht vertraut mit OData, sondern nach den docs sollten Sie so etwas wie /WorkloadsByLabels([email protected])[email protected]=["A","B"] verwenden, wenn Sie ihren Ansatz folgen wollen. So viel ich weiss. Es gibt keine Standardlösung zur Beschreibung komplexer URI-Filter.

+0

Es sieht aus wie eine legitime Lösung, aber ich habe noch nie REST gesehen api so konzipiert ... Sind diese für REST-konforme Endpunkte oder vor allem für URI konventionell? Ich dachte entlang der Linien wie gesagt, [IBM Bluemix REST API] (http://ccsapi-doc.mybluemix.net/), aber sie scheinen komplexe Abfrage nicht zu unterstützen ... – cookieisaac

+0

@cookieisaac Wenn Sie suchen Für eine Standardlösung sollten Sie die URI-Vorlagen https://tools.ietf.org/html/rfc6570 überprüfen. Es definiert einen Listentyp, der dem URI als durch Komma getrennte Elemente hinzugefügt wird. Leider unterstützt nicht jeder Server ein Komma in URI, z. IIS hat Probleme damit. Afaik das Plus-Zeichen wird hauptsächlich verwendet, um Suchbegriffe zu trennen und Listenelemente nicht zu trennen, also ist es nur ein Tipp, keine Konvention, soweit ich weiß. Auf der anderen Seite ist URI-Vorlagen ein Standard, so dass Sie die IDs mit Komma trennen können, wenn Ihr Server dies unterstützt. Das Abfragezeichenfolgenarray ist ebenfalls Standard. – inf3rno

Verwandte Themen