Sollte eine RESTful-API Daten für ein gesamtes Formular bereitstellen?


13

Angenommen, ich habe eine JavaScript-Webanwendung, die vollständig eine RESTful-API für Daten verwendet.

Angenommen, diese Anwendung verfügt über ein Datenformular und ich bearbeite einen Datensatz unter / product / 12345. Beim Erstellen des Formulars stelle ich eine REST-Anforderung an / product / 12345 und erhalte JSON-Daten:

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27
}

Daher enthält mein Formular möglicherweise eine Dropdown-Liste zur Auswahl eines Verkäufers. Ich muss diese Liste ausfüllen. Woher sollen die Daten kommen? Was ist der gebräuchlichste Ansatz?

Wäre es sinnvoll, sie in die / product / 12345-Anforderungsantwort aufzunehmen?

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27,
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ]
}

Was ist mit dem Erstellen eines neuen Datensatzes? Sollte meine API auch auf GET / product / new antworten und Folgendes tun?

{
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ],
  "categories": [
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
  ],
  "etc": [ ... ]
}

Bitte benutze niemals GET request um etwas zu erstellen. Ihr Endpunkt sollte / product not / product / new sein . Um ein neues Produkt zu erstellen, müssen Sie eine PUT-Anforderung an diesen Endpunkt senden.
Kerem Baydoğan

Dies schafft nichts. Dies ist lediglich eine Anforderung vorhandener Daten oder eine Vorlage für einen neuen, noch nicht gespeicherten Datensatz.
Chad Johnson

oh sorry, jetzt verstehe ich was du meinst. In beiden Fällen sollte der Produktendpunkt nicht für die Bereitstellung eines Vorlagenprodukts oder einer Werteliste für Dropdown-Listen für Produkterstellungsformulare verantwortlich sein. Wie @Dan sagt, müssen Sie nur separate Endpunkte erstellen und Cache-Header verwenden, damit Ihr Browser Dropdown-Werte für die Leistung zwischenspeichern kann.
Kerem Baydoğan

Antworten:


6

Ich neige zu sehr einfachen, eng fokussierten Endpunkten. Ich würde eine Anfrage an einem Ort wie / sales_users erwarten, die alle Vertriebsbenutzer zurückgibt.

GET / sales_users:

[
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
]

In ähnlicher Weise würde ich einen separaten Endpunkt hinzufügen, wenn Sie eine Liste mit Kategorien haben möchten.

GET / Kategorien:

[
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
]

Ich würde kein GET / product / new bauen. Stattdessen würde ich in Ihrer App ein Formular erstellen, um neue Produkte hinzuzufügen, die die entsprechenden Anforderungen zum Auffüllen der Listen kennen (z. B. GET / Kategorien, GET / sales_users usw.).


3

Unter der Annahme, dass die Liste der Vertriebsmitarbeiter relativ statisch ist, möchten Sie wahrscheinlich einen separaten API-Aufruf /salesusers, den Sie einmal aufrufen (beim Laden des Formulars usw.) und speichern, damit Sie diese Daten nicht jedes Mal neu anfordern müssen Zeit. Denken Sie daran, dass Sie in REST Ihre API nach Ressourcen organisieren und Vertriebsmitarbeiter Ressourcen logisch von Produkten trennen.

Wenn Sie anrufen /product/new, möchten Sie nur Daten für ein neues Produkt senden, das möglicherweise eine sales_user-ID enthält, aber nichts weiter. Änderungen an einem sales_user selbst wären ein separater Aufruf.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.