Sollte ich unbekannte Parameter zulassen?

12

Ich entwerfe eine RESTful-API und stelle mich dem Titelproblem, das der Klarheit halber neu formuliert wurde:

Sollte ich schnell scheitern, wenn ein Client einen nicht erkannten Parameter sendet? Beispielsweise,

http://example.com/api/foo?bar=true&paula=bean

Dies barist ein gültiger Parameter, der jedoch paulanicht von der API angegeben wird. Sollte ich

  • Warnen Sie den Client vor dem Fehler
  • Scheitern Sie schnell
  • Ignoriere es

Wenn ich den Client warne, kann ich nur für den ersten Parameter eine Warnung ausgeben, da er möglicherweise eine nahezu unendliche Anzahl davon sendet und der Server vermutlich bessere Dinge zu tun hat. Wenn dies fehlschlägt, wird nur der erste ungültige Parameter als Problem angegeben.

Ich bevorzuge die Ablehnung einer Warnung, um den Programmierer zum Handeln zu zwingen, da er das Problem sonst ignorieren und weiterhin Ressourcen verschwenden oder sich versehentlich selbst frachten könnte. Nichts zu tun ist in dieser Hinsicht noch schlimmer.

Sind meine Argumente sinnvoll? Gibt es eine akzeptierte Praxis für solche Dinge?

rath
quelle
Basierend auf einem kleinen Test ignorieren alle Sites, die ich getestet habe, einfach die unbekannten Parameter, die ich angegeben habe.
Bart van Ingen Schenau
@BartvanIngenSchenau Gleich hier. Es ist gut für Web - Seiten , aber ich glaube nicht , dass es für eine tatsächliche API ok
rath
2
Ein Anliegen ist die Aufwärtskompatibilität. Wenn unbekannte Argumente ignoriert werden, können sie in zukünftigen Versionen so verwendet werden, dass Clients auf die neue API programmieren und auf alten Servern dennoch ein angemessenes Verhalten erzielen können.
Walpen
@walpen Das ist ein interessanter Punkt. Die Verwendung versionierter URLs api/v1usw. würde dies erledigen, aber es sind weiterhin keine inkrementellen Aktualisierungen möglich. +1
rath
Dort finden Sie einige Vor- und Nachteile aus der realen Perspektive: Strenge Parameter und Ihre API .
Remek Ambroziak

Antworten:

12

Meiner Meinung nach sollten Sie einen ungültigen Anforderungsstatus zurückgeben, damit der Client weiß, dass das, was er versucht, nicht gültig ist. Meine Meinung zu diesem Thema wird durch das Konzept beeinflusst , dass RESTful APIs sind auffindbar . Wenn Sie im Vorfeld ausreichend Informationen bereitstellen, versucht der Client nie, zunächst eine ungültige Anforderung zu stellen. Wenn dies der Fall ist, liegt ein Fehler im Client-Code vor, und ein schneller Fehler macht den zweiten auf diesen Fehler aufmerksam. Natürlich ist das ein sehr puristischer Ansatz und möglicherweise nicht zu empfehlen, wenn Ihre API nicht erkennbar ist.

Ein pragmatischerer Ansatz könnte darin bestehen, die ungültigen Parameter zu ignorieren. In beiden Fällen sollten Sie jedoch sicherstellen, dass Sie das Verhalten gut dokumentieren.

Quietscheentchen
quelle
1
Als Erweiterung: Wenn ein Client unbekannte / schreibgeschützte / veraltete Parameter sendet, bedeutet dies, dass der Client ein Verhalten erwartet, das nicht erfüllt wird. Und deshalb ist es gefährlich, irgendeine Handlung auszuführen. Also stimme ich zu, streng schlechte Anfrage
Stepan Stepanov
Vielen Dank an @StepanStepanov, aber es gibt die Philosophie "Sei tolerant in dem, was du akzeptierst, explizit darüber, was du sendest", die einem Großteil der Webarchitektur zugrunde liegt. In diesem Sinne könnte ich leicht eine Antwort schreiben, die direkt gegen die Antwort verstößt, die ich bereits geschrieben habe.
RubberDuck
3
Ich habe dies gegoogelt)) Und auf der Seite über das Postelsche Gesetz steht auch "Code, der Eingaben empfängt, sollte nicht konforme Eingaben akzeptieren, solange die Bedeutung klar ist". Ich denke, wenn der Kunde uns einen unbekannten Parameter sendet, kann seine Bedeutung nicht klar sein. Wenn der Client uns einen veralteten Parameter sendet, ist klar, dass er nicht mehr so ​​funktioniert, wie er es erwartet. Wenn der Client uns einen schreibgeschützten Parameter sendet, ist klar, dass er nicht so geschrieben wird, wie er es wünscht.
Stepan Stepanov
0

Wenn Sie eine öffentliche API (oder eine API, die von einem anderen Team verwendet wird) verwenden, würde ich einen Rückgabefehler empfehlen, wie von @RubberDuck vorgeschlagen.

Wenn Ihre API nur innerhalb Ihres Teams (oder nur von Ihnen selbst) konsumiert wird, ist es möglicherweise einfacher, zusätzliche Felder zu ignorieren (z. B. erfordert weniger Code und ist einfacher zu tun).

Konstantin Petrukhnov
quelle